2 Pluspunkte 0 Minuspunkte

Ich wusste nicht welchen Titel ich nehmen soll weil ich nicht genau weis was mein Problem ist. Ich habe einen Code in C um eine Dll Datei dynamisch zu laden.

#ifdef _WIN32
#include <windows.h>
typedef HANDLE lib_t;
#else
#include <dlfcn.h>
typedef void* lib_t;
#endif

lib_t MyLoadLib(const char* lib) {
    #ifdef _WIN32
    return LoadLibraryA(lib);
    #else
    return dlopen(lib, RTLD_LAZY);
    #endif
}

void MyUnloadLib(lib_t lib) {
    #ifdef _WIN32
    FreeLibrary(lib);
    #else
    dlclose(lib);
    #endif
}

void* MyLoadProc(lib_t lib, const char* proc) {
    #ifdef _WIN32
    return GetProcAddress(lib, proc);
    #else
    return dlsym(lib, proc);
    #endif
}

Ich wollte diesen Code in ein Programm von mir (in C++ geschrieben) übernehmen weil ich dachte G++ kann ja auch C kompilieren. Aber dabei kommt

main.cpp: In function 'void MyUnloadLib(lib_t)':
main.cpp:42:20: error: invalid conversion from 'lib_t {aka void*}' to 'HMODULE {aka HINSTANCE__*}' [-fpermissive]
     FreeLibrary(lib);
                    ^
In file included from c:\mingw\include\windows.h:44:0,
                 from main.cpp:6:
c:\mingw\include\winbase.h:1624:24: note:   initializing argument 1 of 'BOOL FreeLibrary(HMODULE)'
 WINBASEAPI BOOL WINAPI FreeLibrary (HMODULE);
                        ^~~~~~~~~~~
main.cpp: In function 'void* MyLoadProc(lib_t, const char*)':
main.cpp:50:36: error: invalid conversion from 'lib_t {aka void*}' to 'HINSTANCE {aka HINSTANCE__*}' [-fpermissive]
     return GetProcAddress(lib, proc);
                                    ^
In file included from c:\mingw\include\windows.h:44:0,
                 from main.cpp:6:
c:\mingw\include\winbase.h:1818:27: note:   initializing argument 1 of 'int (__attribute__((__stdcall__)) * GetProcAddress(HINSTANCE, LPCSTR))()'
 WINBASEAPI FARPROC WINAPI GetProcAddress (HINSTANCE, LPCSTR);
                           ^~~~~~~~~~~~~~
main.cpp:50:26: error: invalid conversion from 'FARPROC {aka int (__attribute__((__stdcall__)) *)()}' to 'void*' [-fpermissive]
     return GetProcAddress(lib, proc);
            ~~~~~~~~~~~~~~^~~~~~~~~~~

Wie kann ich diesen Code in mein C++ Programm implementieren?

von  

1 Antwort

1 Pluspunkt 0 Minuspunkte

Der Datentyp lib_t (alias void*) in C++ ist nicht direkt mit den Windows API Typen HMODULE und HINSTANCE kompatibel. In C++ ist der Typ HMODULE nicht dasselbe wie void*. Um das zu umgehen, kannst du HMODULE in der MyUnloadLib-Funktion und HINSTANCE in der MyLoadProc-Funktion explizit casten.

#ifdef _WIN32
#include <windows.h>
typedef HMODULE lib_t;  // Ändern Sie den Datentyp auf HMODULE für Windows
#else
#include <dlfcn.h>
typedef void* lib_t;
#endif

lib_t MyLoadLib(const char* lib) {
    #ifdef _WIN32
    return LoadLibraryA(lib);
    #else
    return dlopen(lib, RTLD_LAZY);
    #endif
}

void MyUnloadLib(lib_t lib) {
    #ifdef _WIN32
    FreeLibrary(reinterpret_cast<HMODULE>(lib));
    #else
    dlclose(lib);
    #endif
}

void* MyLoadProc(lib_t lib, const char* proc) {
    #ifdef _WIN32
    return reinterpret_cast<void*>(GetProcAddress(reinterpret_cast<HMODULE>(lib), proc));
    #else
    return dlsym(lib, proc);
    #endif
}

Die reinterpret_cast-Anweisungen werden verwendet, um den expliziten Cast zwischen lib_t und HMODULE (bzw. HINSTANCE auf Windows) durchzuführen. Das ist Windows spezifisch, für andere Plattformen bleibt lib_t ein einfacher void*.

von (732 Punkte)