Funktion aus Binär-Datei laden
-
Moin.
Folgendes Problem:
Ich hab eine Binär-Datei gelinkt als executable. In der gibt es eine Funktion wie folgt:CRegistrator *g_registrator = NULL; extern "C" __declspec(dllexport) GetRegister(int reason) { switch(reason): { case EF_LOAD: { g_registrator = new CRegistrator(); return g_registrator } case EF_UNLOAD:{ delete g_registrator; break; } } }
Diese Executable lade ich nun mithilfe von wxWidgets (wxDynamicLibrary) in Windows und rufe die GetRegister() auf.
Nun bekomme ich einen Speicher-Zugriffsfehler, in der Zeile wo die Klasse CRegistrator() angelegt wird.
Wenn ich das ganze als .dll kompiliere, geht es problemlos.
Frage hierzu:
1.) Liegt das an wxWidgets?
2.) Wenn ja, kennt jemand eine Lib, die XPlatform ist, mit der das geht?
3.) wenn nein, was muss ich tun, damit es funktioniert? Wie muss ich das ganze laden?
Regards
-
kann sein, dass 'new' rumzickt?
versuch es mal so:CRegistrator g_registrator; extern "C" __declspec(dllexport) GetRegister(int reason) { switch(reason): { case EF_LOAD: { return &g_registrator; } case EF_UNLOAD:{ // ncht mehr noetig break; } } }
-
äähm, was mir noch auffällt: wo ist der rückgabewert deiner funktion? mach mal ein:
extern "C" __declspec(dllexport) [b]CRegistrator*[/b] GetRegister(int reason)
daraus.
-
~fricky schrieb:
kann sein, dass 'new' rumzickt?
versuch es mal so:CRegistrator g_registrator; extern "C" __declspec(dllexport) GetRegister(int reason) { switch(reason): { case EF_LOAD: { return &g_registrator; } case EF_UNLOAD:{ // ncht mehr noetig break; } } }
Im "richtigen Code" sprich im .cpp-File ist der Rückgabe-Wert natürlich vorhanden, war nen Copy&Paste Fehler.
Und ja, der Crash ist bei new(). Da crasht es random irgendwo in der App.
So wie hier oben hab ichs auch schon probiert, leider erfolglos.
Ich bekommme dann ein Virtual File Table, das auf NULL zeigt. Für das CRegistrator gibts CIRegistrator, ein pure virtual Interface:
[cpp]
class CIRegistrator
{
public:
virtual void RegisterAll() = 0;
// usw
};
[ /cpp]
greets
-
Zusatz: Stell ich das Projekt auf DLL um (VC++ 2008 Express), funktioniert der Code ohne Änderung (ausser dass ich in der Host-Applikation den namen von foo.exe auf foo.dll ändere) und es sind keine #ifdef _DEBUG vorhanden!
greets