C++ я потрачу немного времени, объясняя свой проект stucture:CoCreateInstance() -858993460 (в comip.h)
Есть три DLLs:
- mclController.dll - третья сторона dll, написанный на C# для управления аппаратным обеспечением.
- MCLWrapper.dll - я написал этот ll на C#, чтобы он работал как COM, чтобы вывести mclControl.dll на родную C++ dll.
- ThorDetectorSwitch.dll - Я написал эту dll с родным C++.
Состав:
- ThorDetectorSwitch.dll называет MCLWrapper.dll который оборачивает mclController.dll.
- Я использую небольшое тестовое консольное приложение в C++, TDSTest.exe для вызова ThorDetecttorSwitch.dll.
Так что в основном работает следующим образом: TDSTest.exe -> ThorDetectorSwitch.dll -> MCLWrapper -> mclController.dll
Некоторый код:
-Как TDSTest.exe (консольное приложение для Windows, построенный с конфигурацией x64) вызывает ThorDetectorSwitch.dll:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <math.h>
#include <windows.h>
#include "TDSTest.h"
typedef long (*TDSFindDevices)(long&);
typedef long (*TDSGetParam)(const long, double&);
typedef long (*TDSTeardownDevice)();
typedef long (*TDSStartPosition)();
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
if (argc < 2)
{
cout<<"This is ThorDetecttorSwitch test program."<<endl;
return 1;
}
HINSTANCE hInst = LoadLibrary(_T(".\\Modules_Native\\ThorDetectorSwitch.dll"));
if(hInst == NULL)
{
DWORD err = GetLastError();
cout<<"Error loading ThorDetectorSwitch.dll. Program exiting..."<<endl;
return 1;
}
}
-Constructor в ThorDet ectorSwitch.dll EDITTED! на 06/15/2013, Центральное время 19:41
ThorDetectorSwitch::ThorDetectorSwitch() :_mcSwitch(ComHelper(__uuidof(MCLControlClass)))
{
CoInitialize(NULL);
MCLWrapper::MCLControlPtr mclSmartPtr;
HRESULT hr = CoCreateInstance(__uuidof(MCLWrapper::MCLControlClass), NULL, CLSCTX_ALL, __uuidof(MCLWrapper::MCLControl), (void**)&mclSmartPtr); // program breaks right here!!!
_mcSwticth = mclSmartPtr;
_A = WstringToBSTR(L"A");
_B = WstringToBSTR(L"B");
_C = WstringToBSTR(L"C");
_D = WstringToBSTR(L"D");
_deviceDetected = FALSE;
}
MCLWrapper, что делает COM объект
// C# COM wrapper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using mcl_RF_Switch_Controller64;
using System.Runtime.InteropServices;
// for function reference see miniCircuit RF controller manual
namespace MCLWrapper
{
[Guid("7C312A7C-2E77-4de7-A76F-990F268AB818")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface MCLControl
{
[DispId(1)]
void Connect(string SerialNumber);
[DispId(2)]
void Set_Switch(string SwitchName, int Val);
[DispId(3)]
void Set_SwitchesPort(byte binVal);
[DispId(4)]
void GetSwitchesStatus(int statusRet);
[DispId(5)]
void Disconnect();
};
[Guid("BEC33A1D-BB98-4332-B326-92D480ECC246"),
ClassInterface(ClassInterfaceType.None)]
public class MCLControlClass : MCLControl
{
private USB_RF_SwitchBox _sb = new USB_RF_SwitchBox();
public void Connect(string SerialNumber)
{
_sb.Connect(ref SerialNumber);
}
public void Set_Switch(string SwitchName, int Val)
{
_sb.Set_Switch(ref SwitchName, ref Val);
}
public void Set_SwitchesPort(byte binVal)
{
_sb.Set_SwitchesPort(ref binVal);
}
public void GetSwitchesStatus(int statusRet)
{
_sb.GetSwitchesStatus(ref statusRet);
}
public void Disconnect()
{
_sb.Disconnect();
}
}
}
Моя проблема:
Когда TDSTest выполняется, его первые показы
HINSTANCE hInst = LoadLibrary(_T(".\\Modules_Native\\ThorDetectorSwitch.dll"));
затем он ломается по адресу: hr = CoCreateInstance(......)
в ThorDetectorSwitch.cpp
hr = -858993460
возвращение;
Несколько
Вспомогательные- Я продолжал быть сказан, что это было потому, что
CoInitialized()
не дозвонились, и это причина, но я чувствую, что это не причина, потому что это ThorDetectorSwitch.dll работает отлично отлично с другим приложением, и я верю, что в своем коде я вызвалCoInitialized()
. - Я зарегистрировал свой MCLWrapper.dll с
regasm MCLWrapper.dll /tlb:MCLWrapper.tlb /codebase
- Выход отладчика: «Попытка управляемого выполнения внутри ОС Блокировка загрузчика. Не пытайтесь запустить управляемый код внутри функции инициализации DllMain или изображения, поскольку это может привести к зависанию приложения».
Так что прямо сейчас я понятия не имею, в каком направлении я должен идти, и я боролся с этой проблемой в течение нескольких дней. Поэтому я действительно надеюсь, что кто-то может дать мне несколько указателей. Благодаря!
1) -858993460 не является допустимой ошибкой COM (уже объяснил это и почему). 2) Когда приложение выходит из строя, вы получаете исключение, и если да, то какой? 3) При попытке вызова в CoCreateInstance() приложение оказалось неудачным, - я также упомянул об этом. Это указывает на то, что с вашей оберткой что-то не так, но поскольку я не парень из C#, я не собираюсь догадываться. –
Возможный дубликат [Значения структуры не остаются, значения изменены на -858993460] (http://stackoverflow.com/questions/14841507/stucture-values-not-staying-values-changed-to-858993460) –
@HansPassant Похоже, в моем коде что-то не инициализируется. Это то, что я пытаюсь понять. –