Crypt32.dll einbinden
-
Hallo,
ich möchte Funktionen aus der Crypt32.dll dynamisch in mein Programm einbinden.
Ich benutze Eclipse+CDT und MinGW zum Kompilieren. In MinGW sind schon einige Funktionen aus der MS Crypto integriert, jedoch bei weitem nicht alle. Deswegen versuche ich die fehlenden Funktionen aus der DLL zu laden (z.b. CertEnumCertificatesInStore, CertGetNameStringA).
Kann man auch Datentypen (z.B. PCCERT_CONTEXT) aus der DLL dynamisch importieren???..... #define CERT_NAME_ATTR_TYPE 3 #define CERT_NAME_ISSUER_FLAG 0x1 #define CERT_STORE_PROV_SYSTEM_A ((LPCSTR) 9) #define CERT_STORE_PROV_SYSTEM_W ((LPCSTR) 10) #define CERT_STORE_PROV_SYSTEM CERT_STORE_PROV_SYSTEM_W #define szOID_COMMON_NAME L"2.5.4.3" typedef PCCERT_CONTEXT (*CertEnumCertificatesInStore)(HCERTSTORE,PCCERT_CONTEXT); typedef DWORD (*CertGetNameStringA) (PCCERT_CONTEXT,DWORD,DWORD,void*,LPTSTR,DWORD); ...... char pszNameString[256]; int i=0; char *cert_str[100]; HINSTANCE hinstLib = LoadLibrary(L"Crypt32.dll"); CertEnumCertificatesInStore dll_CertEnumCertificatesInStore; CertGetNameStringA dll_CertGetNameStringA; if (hinstLib) { hCertStore = CertOpenStore((LPCSTR)CERT_STORE_PROV_SYSTEM, 0,(HCRYPTPROV) NULL, (DWORD) CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY"); // diese Funktion kriege ich aus dem MinGW-include !!!! dll_CertEnumCertificatesInStore = (CertEnumCertificatesInStore) GetProcAddress(hinstLib, "CertEnumCertificatesInStore"); dll_CertGetNameStringA = (CertGetNameStringA) GetProcAddress(hinstLib, "CertGetNameStringA"); while( pCertContext = dll_CertEnumCertificatesInStore (hCertStore, pCertContext ) ) { if ( !GetLastError() ) { if( dll_CertGetNameStringA(pCertContext,CERT_NAME_ATTR_TYPE,0,(void*) szOID_COMMON_NAME, (LPTSTR) pszNameString,128)) // Aus dieser Funktion holt man sich für pszNameString den Common Name des Zertifikats { if ( !GetLastError() ) { cert_str[i] = (char *) calloc(500, sizeof(char)); strcpy(cert_str[i], pszNameString); } } } max_certs = i + 1; i++; } fFreeResult = FreeLibrary(hinstLib); }
Für Variable pszNameString erhalte ich nicht den richtigen Wert. Ich weiß nicht, woran das liegt.
Es ist aber kein Compile-Fehler. Das Programm läuft, nur die Werte stimmen nicht.
Wenn ich es statisch mache (also mit .h, .lib oder .a), funktioniert es hervorragend.
Ich bin verzweifelt. Ich würd mir wünschen, jemand von euch könnte mir da helfen. Vielleicht mache ich da etwas falsch?Danke schon mal.
Grüße
-
Ich würde zuerst mal sagen, dass die Aufrufkonventionen nicht stimmen: Die sind __stdcall ind nicht _cdecl.
Datentypen braucht man nicht aus der DLL zu laden, sondern dies sind einfach nur typedefs... (nur das pack muss halt stimmen; aber wenn Du di h-Datei einbindest sollte es eigentlich stimmen).
-
1000 Dank erstmal.
Die sind __stdcall ind nicht _cdecl
So ganz weiß ich nicht, was Du meinst. Hat es mit den typedefs zu tun? Wie sollte ich diese denn schreiben?
-
ypedef PCCERT_CONTEXT (__stdcall *CertEnumCertificatesInStore)(HCERTSTORE,PCCERT_CONTEXT); typedef DWORD (__stdcall *CertGetNameStringA) (PCCERT_CONTEXT,DWORD,DWORD,void*,LPTSTR,DWORD);