c DLL benutzen



  • Hallo Forum,

    ich möchte eine Funktion aus einer c-dll in meinem Programm dynmisch benutzen.
    Die betreffende Funktion ist so definiert:

    __declspec(dllexport) int _cdecl multi2(int);
    

    Mein Programm sieht so aus:

    int (_cdecl* multi2)(int);
    
    void loadDLL(char* name) {
    HINSTANCE hDLL = 0;
    hDLL = LoadLibrary("C:\\Temp\\dllexporting.dll");	
    
    if(hDLL != NULL) {
    printf("DLL geladen.");
      multi2 = (BOOL CALLBACK(__cdecl *)(void))GetProcAddress(hDLL, "multi2"); 
      printf("4 * 2= ", multi2(4));
      FreeLibrary(hDLL);
    } else {
      printf("DLL nicht geladen.");
    }
    }
    

    Könntet Ihr mir da weiterhelfen? Wenn ich einen Link zu einem funktionierendem BSP (C DLL Projekt+Test Projekt) bekommen würde wäre mir auf jeden Fall geholfen. Im Inet habe ich ein paar BSP's gefunden. Haben mir aber nicht wirklich weitergeholfen.

    Viele Grüße

    Peter



  • Und was gibt es aus?



  • Vielleicht nutzt es was, die Funktion im EXE-Modul so zu deklarieren:
    __declspec(dllimport) int _cdecl multi2(int);



  • Im Code hatte ich noch einen Fehler...

    #include "stdafx.h"
    #include <shlobj.h>
    #include <stdio.h>
    #include <windows.h>
    
    HINSTANCE hDLL = 0;
    int (_cdecl* multi2)(int);
    //__declspec(dllimport) int _cdecl multi2(int);
    
    void loadDLL(char* name) { 
    
    	hDLL = LoadLibrary("C:\\Temp\\dllexporting.dll");     
    
    	if(hDLL != NULL) { 
    		printf("DLL geladen."); 
    		multi2 = (int CALLBACK(__cdecl *)(void))GetProcAddress(hDLL, "multi2"); 
    		printf("4 * 2= ", multi2(4)); 
    		FreeLibrary(hDLL); 
    	} else { 
    		printf("DLL nicht geladen."); 
    	} 
    }
    
    int main(int argc, char* argv[]) {
    	loadDLL(NULL);
    	return 0;
    }
    

    Die Fehler sehen so aus:

    dlltest2.cpp
    C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2059: Syntaxfehler : '__cdecl'
    C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2143: Syntaxfehler : Fehlendes ')' vor '('
    C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2066: Typumwandlung in Funktionstyp nicht erlaubt
    C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2059: Syntaxfehler : ')'
    C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2440: 'type cast' : 'void' kann nicht in 'int (__stdcall *)(void)' konvertiert werden
            Ausdruck vom Typ void kann nicht in andere Typen konvertiert werden
    Fehler beim Ausführen von cl.exe.
    
    dlltest2.exe - 5 Fehler, 0 Warnung(en)
    


  • Ach ja, der Code von der dll sieht so aus:

    //#ifndef _CONTR_H_INCLUDED__
    //#define _CONTR_H_INCLUDED__
    
    #if defined(__cplusplus)
    extern "C" {
    #endif
    
    #define EXPORT	__declspec(dllexport)
    #define CALL		_cdecl
    EXPORT int CALL multi2(int); 
    
    #if defined(__cplusplus)
    }
    #endif
    //#endif
    
    #include <windows.h>
    
    HINSTANCE g_hInstance;
    int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) {
    	switch (fdwReason) {
    		case DLL_PROCESS_ATTACH:
    			g_hInstance = hInstance;
    			break;
    		case DLL_PROCESS_DETACH:
    			break;
    	}
    	return TRUE;
    }
    
    EXPORT int CALL multi2(int factor) {
    	return factor*2;
    }
    


  • typedef int (_cdecl* MULTI2)(int); 
    ...
    MULTI2 multi2 = (MULTI2)GetProcAddress(hDLL, "multi2"); 
    ... 
    printf("4 * 2= ", multi2(4));
    


  • Hallo CMatt,

    vielen Dank für die Hilfe, ich probiers gleich aus.

    Viele Grüße

    Peter


Anmelden zum Antworten