2016-05-01 17 views
0

Ich versuche COM-Sicherheit von DLL zu initialisieren, aber ich bekomme Fehler 800401f0. Im mit meist einen standart Ansatz,Initialisierung der COM-Sicherheit fehlgeschlagen

Code:


HRESULT hres; 

    hres = CoInitializeEx(0, COINIT_MULTITHREADED); 

    // Step 2: -------------------------------------------------- 
    // Set general COM security levels -------------------------- 

    hres = CoInitializeSecurity(
     NULL, 
     -1,       // COM authentication 
     NULL,      // Authentication services 
     NULL,      // Reserved 
     RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication 
     RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
     NULL,      // Authentication info 
     EOAC_NONE,     // Additional capabilities 
     NULL       // Reserved 
     ); 

und es funktioniert ziemlich gut, wenn ich es von meinem app.exe laufen, aber Problem ist, dass im Innern es .DLL- ausgeführt wird, der tatsächlich ist ein Funktionserweiterer für Main.exe (das habe ich keinen Zugang - Quelle oder irgendwelche).

Und der ganze Code, den ich verwende, um Maschinendaten wie zu erhalten - BIOS Version, über IWbemClassObject & IEnumWbemClassObject, so frag du mich, was sind die leichter/einfachen Wege zur Lösung es, oder retriving die Hardware-Daten (wie BIOSVersionWin32_BIOS SerialNumberWin32_VideoController Name?

Antwort

0

Fehler 800401f0 bedeuten, dass CoInitialize nicht für aktuellen Thread aufgerufen wurde, aber Ihr Code-snippet macht es aussehen, wie es ist.

ich denke, dass der Code im Code-Schnipsel gezeigt entweder von Ihrem eigenen app.exe ist, oder wenn es von der DLL kommt, dann werden diese zwei Anrufe nicht auf demselben gemacht Faden.

Dies bedeutet, dass Sie COM in der DLL initialisieren müssen, aber das ist nicht so einfach wie es aussehen kann, wie Sie die Anwendung Threads nicht steuern - Initialisierung von COM in einer DLL sollte vermieden werden, es sei denn, Sie können sicherstellen Sie steuern den Thread, auf dem die COM-Aufrufe ausgeführt werden.

Eine mögliche Lösung ist create a worker thread for COM calls where you can initialize COM according to your requirements.

+0

in Ordnung, jetzt ist es ein bisschen klarer, also sollte ich einen Aufruf für 'DLLMain DLLDLL_THREAD_ATTACH' machen? 'BOOL APIENTRY DllMain (HMODULE hModule, \t DWORD ul_reason_for_call, \t LPVOID LpReserved \t)' 'Fall DLL_THREAD_ATTACH: SetCOMInit()' - dass das, was Worker-Thread wäre? – LighFusion

+0

Ich bin mir nicht sicher, ob ich richtig verstanden habe, aber Sie können nicht einfach COM in DllMain Anruf initialisieren. Sie müssen einen Thread erstellen, der eigentlich ein kniffliges Geschäft ist: http://stackoverflow.com/questions/1688290/creating-a-thread-in-dllmain –

+0

Verdammt, das scheint wirklich hart, vielleicht gibt es ein paar bessere Möglichkeiten HWID-Informationen abrufen, um das Programm auf der Maschine, die es ausführt, zu binden. – LighFusion