CoInitialize() n'a pas été appelé exceptions en C++
-Mon problème
J'ai eu CoInitialize n'a pas été appelé exption.
-Mon projet de structure
Voici mon problème. J'ai une dll COM, MCLWrapper.dll développé avec C#; j'ai un autre natif de dll C++, ThorDetectorSwitch.dll que les appels MCLWrapper.dll Et enfin, j'ai une application console TDSTest.exe que les appels ThorDetectorSwitch.dll. En gros, quelque chose comme ceci:
TDSTest.exe (C++ console) -> ThorDetectorSwitch.dll (C++ natif) -> MCLWrapper.dll (C#)
Code TDSTest.exe chargement de la ThorDetectorSwitch.dll:
HINSTANCE hInst = LoadLibrary(_T("C:\\TIS_Nick\\Hardware\\Devices\\ThorDetectorSwitch\\TDSTest\\TDSTest\\Debug\\Modules_Native\\ThorDetectorSwitch.dll"));
Constructeur en ThorDetectorSwitch.cpp
ThorDetectorSwitch::ThorDetectorSwitch() : _mcSwitch(__uuidof(MCLControlClass))
{
_A = WstringToBSTR(L"A");
_B = WstringToBSTR(L"B");
_C = WstringToBSTR(L"C");
_D = WstringToBSTR(L"D");
_deviceDetected = FALSE;
}
Le point de rupture frappe la première parenthèse du constructeur de la ThorDetectorSwitch.dll ci-dessus, mais l'exception s'est produite immédiatement si j'ai frappé F10 (une étape de plus)
Il saute
hr = CoCreateInstance(rclsid, pOuter, dwClsContext, __uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown));
dans le comip.h. La rh est tout simplement "CoInitialize n'a pas été appelé".
J'ai pensé abou ce problème pendant des jours, et ne peut pas trouver une solution. Quelqu'un ici peut le partage des idées? Vraiment l'apprécier.
- Je pense que vous devez appeler
CoInitialize()
. Source: le message d'erreur flipper dit "CoInitialize() n'a pas été appelé" - J'ai appelé CoInitialize() comme le Roseau mentionné, mais il est un autre problème. Voir mes commentaires du Roseau.
init_apartment();
n'était probablement pas appelé avant d'utiliser les composants winrt pour ceux qui courent à travers cette question lors de l'apprentissage de C++/WinRT. Assurez-vous que la ligne s'exécute en premier.
Vous devez vous connecter pour publier un commentaire.
Votre dll COM vous oblige à être en Single-Threaded Apartment mode. Vous devez appeler
CoInitialize
avant de l'utiliser.Ajouter à votre .exe:
main()
), et seulement de l'appeler une fois. Elle met en place des thread. Vous pouvez aussi ajouterCoUninitialize
à la fin de votre programme.TDSTest.exe
appelle cela avant l'utilisation de votre DLL