Problem mit LoadLibrary

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!
Ich hab' hier ein ziemlich fieses Problem mit dem Laden Von Dll's und Funktionen daraus.

Hier ist die DLL:
Code:
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Entfernen Sie dies, wenn Sie lpReserved verwenden
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("PVCSTEST.DLL Initializing!\n");
        
        // One-Time-Initialisierung der Erweiterungs-DLL
        if (!AfxInitExtensionModule(PVCSTestDLL, hInstance))
            return 0;

        new CDynLinkLibrary(PVCSTestDLL);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        TRACE0("PVCSTEST.DLL Terminating!\n");
        // Bibliothek vor dem Aufruf der Destruktoren schließen
        AfxTermExtensionModule(PVCSTestDLL);
    }
    return 1;   // OK
}

__declspec(dllexport) CString GetVCSName()
{
    return CString("Merant Version Manager");
}
Ich will also erstmal nur einen CString ausgeben.
Die Dll und den Funktionspointer hole ich mir so:
Code:
int CPVCSTestAppDlg::OpenDll(CString cstrDllPath)
{
    HINSTANCE hLib;
    LPGETNAMEFUNC pGetNameFunc;
    CString cstrVcsName;

    hLib = LoadLibrary(cstrDllPath);

    if(hLib == NULL) return -1;

    pGetNameFunc = (LPGETNAMEFUNC)GetProcAddress(hLib, "GetVCSName");

    if(pGetNameFunc == NULL) return -2;

    cstrVcsName = pGetNameFunc();

    return 0;
}
Nun ist es aber so, daß mir der LoadLibrary-Aufruf den Wert 0x10000000 zurückliefert, was mit schon etwas seltsam vorkommt. Der Aufruf von GetProcAddress liefert dann auch NULL zurück.
Wenn mir einer sagen könnte, was da falsch läuft, wäre ich echt dankbar!
 
Ich hab's rausgefunden. Wie in anderen Posts hier schon beschrieben, muß ich ein extern "C" vor die Funktionsdefinition setzen:
Code:
extern "C" __declspec(dllexport) CString GetVCSName()
{
    return CString("Merant Version Manager");
}
Dann gibt es allerdings eine Compilerwarnung, daß die Funktion mit extern "C" deklariert sei aber mit CString eine Klasse als Rückgabetyp hätte und somit eine C++ Funktion sei. Mit extern "C++" funktioniert es aber auch nicht, da kommt von 'GetProcAddress' auch NULL zurück.
Kann mir das jemand erklären?
 
Zurück