Problem mit Funktions-Pointer an eine DLL funktion



  • Hallo,
    ich habe leider schon wieder ein Problem mit meiner DLL, diesmal mit Funktions-Pointer. Der Pointer kann genau einmal aufgerufen werden, und ab dem zweiten mal kriege ich einen Runtime-Error: "Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in [...].exe oder in einer der geladenen DLLs hinweist."

    So mache ich das ganze gerade:

    // Mein Klasse in der DLL
    
    typedef wstring(*TestFunc)(DWORD id);
    
    class CONTROLSDLL_API Test
    {
    public:
    	Test(TestFunc TestFunction);
    	~Test();
    
    private:
    	TestFunc TestFunction;
    
    };
    
    Test::Test(TestFunc TestFunction)
    {
    	this->TestFunction = TestFunction;
    	// Funktioniert noch
    	TestFunction(2);
    	// Runtime-Error
    	TestFunction(2);
    }
    
    //  Und das ist die funktion deren Pointer übergeben wird
    wstring GetString(DWORD id)
    {
    	id += AppSettings->GetApplicationLanguage();
    	wchar_t Buffer[512];
    	LoadString(GetModuleHandle(NULL), id, Buffer, 512);
    	wstring resultStr = Buffer;
    	return resultStr;
    }
    

    Vielen Dank
    Johannes


  • Mod

    Wundert nicht, wenn Du nicht die gleiche CRT verwendest.
    http://msdn.microsoft.com/en-us/library/ms235460.aspx

    Wenn man C++ Objekt - wie wstring - über DLL Grenzen hinweg auszutauscht muss man sich 100% klar sein was man macht.
    Mehr oder weiger werden DLL/EXE zu einer "Einheit". Wenn man nur den SP einer CRT wechselt und ein Modul aleine austauscht führt das evtl. sofort wieder zu einem Crash.

    Wenn Du das willst darfst Du in keinem Fall die CRT statisch linken.



  • Ich rate zu einem "normalen" C-Interface, so wie es auch die WinAPI macht. Dann hast Du solche Probleme nicht....

    Also deklariere die Funktion so:

    void GetString(DWORD id, wchar_t* szBuffer, size_t nBufferLen);
    


  • Vielen Dank!! So funktioniert's!


Anmelden zum Antworten