2013-06-12 24 views
6

- mio problemaCoInitialize() non è stato chiamato eccezioni in C++

ho ottenuto CoInitialize non è stato chiamato exption.

- mia struttura di progetto

Ecco il mio porblem. Ho una DLL COM, MCLWrapper.dll sviluppata con C#; Ho un dll nativo C++ nativo, ThorDetectorSwitch.dll che chiama MCLWrapper.dll; E infine, ho un'applicazione console TDSTest.exe che chiama ThorDetectorSwitch.dll. Fondamentalmente, qualcosa di simile:

TDSTest.exe (C++ console) -> ThorDetectorSwitch.dll (C++ nativo) -> MCLWrapper.dll (C#)


Codice in TDSTest.exe che i carichi il ThorDetectorSwitch.dll:

HINSTANCE hInst = LoadLibrary(_T("C:\\TIS_Nick\\Hardware\\Devices\\ThorDetectorSwitch\\TDSTest\\TDSTest\\Debug\\Modules_Native\\ThorDetectorSwitch.dll")); 

di costruzione della 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; 
} 

Il punto di rottura colpisce la prima parentesi del costruttore della ThorDetectorSwitch.dll sopra, ma l'eccezione si è verificata immediatamente se ho colpito F10 (un passo in più)

Si salta a

hr = CoCreateInstance(rclsid, pOuter, dwClsContext, __uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown)); 

nel ComIP .h. L'hr è semplicemente "CoInitialize non è stato chiamato".

Ho pensato a questo problema per giorni e non riesco a trovare una soluzione. Chiunque qui può condividere pensieri? Lo apprezzo davvero.

+4

Credo che è necessario chiamare 'CoInitialize()'. * Fonte: il messaggio di errore "peggio" dice "CoInitialize() non è stato chiamato" * –

+0

@LuchianGrigore Ho chiamato CoInitialize() come menzionato Reed, ma c'è un altro problema. Vedi i miei commenti a Reed's. –

risposta

10

La tua DLL COM richiede di essere in modalità Appartamento a thread singolo. È necessario chiamare CoInitialize prima di utilizzarlo.

Aggiungi questo al vostro exe:

CoInitialize(nullptr); // NULL if using older VC++ 

HINSTANCE hInst = LoadLibrary(_T("C:\\TIS_Nick\\... 
+0

Come faccio? Dove dovrei aggiungere CoInitialize()? E quanti di questi dovrei aggiungere? Grazie. –

+1

@NickXTsui In genere lo inserisco all'inizio del punto di ingresso ('main()'), e lo chiamo solo una volta. Imposta * quel thread *. Potresti anche voler aggiungere 'CoUninitialize' alla fine del tuo programma. –

+0

@NickXTsui Assicuratevi che 'TDSTest.exe' lo chiami prima di usare la DLL –