DLL access violation
-
Hallo,
ich wollte in einer DLL u.a. ein paar AnsiString Pfadvariablen ablegen und die dann in einer Applikation, welche die DLL dynamisch einbindet, abrufen.
Ich bekomme aber immer die Fehlermeldung:
**Access viaolation at address 00000000 read of address 00000000
**DLL einbinden und erstellen ist kein Problem.
-
Hallo
Die Kombination aus Dynamisch einbinden und AnsiString ist schonmal ein Fehlergrund. Denn dynamisch einbinden lassen sich nur DLLs mit reinem C-Interface, und AnsiString ist eine C++ Klasse. Also entweder statisch einbinden oder statt AnsiString nur noch char* im Interface verwenden.
Ansonsten must du Code zeigen um eine konkrete Antwort zu bekommen.
bis bald
akari
-
Die Stringprobleme gibts ja glaube ich nur, wenn man einen Stringparameter an eine DLL-Funktion übergibt, aber nicht wenn die Funktion einen String (AnsiString) Rückgabewert hat!?
Code der DLL:
//--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #pragma hdrstop #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- AnsiString __declspec(dllexport) GetCFG() { AnsiString sCFG = "c:\\cfg.txt"; return sCFG; }
Code das Hauptprogramms:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; HINSTANCE dll = LoadLibrary("klasse.dll"); AnsiString (__stdcall *GetCFG)(); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { FreeLibrary(dll); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage(GetCFG()); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { GetCFG = (AnsiString (__stdcall *)())GetProcAddress(dll,"_GetCFG"); } //---------------------------------------------------------------------------
-
Hallo
Egal ob Parameter oder Rückgabewert, AnsiString ist nicht reines C. Damit kann es zu Problemen beim dynamischen Linken kommen. Sauber ist also nur char*. Und damit kommt dann das Problem der Speicherverwaltung.
bis bald
akari
-
Das Problem scheint nicht beim AnsiString als Rückgabewert zu liegen, ich habe mal eine bool Rückgabe eingebaut und habe ideselbe Fehlermeldung bekommen. Vielleicht stimmt doch was nicht in meinem Quelltext!?
-
Deine dll wird doch gar nicht geladen. Dieser Code hier
HINSTANCE dll = LoadLibrary("klasse.dll");
wird doch da wo er steht nie ausgeführt. Der gehört auch noch in die FormCreate. Der Rückgabewert muss auch noch getestet werden. Du prüfst weder ob die dll geladen wurde, noch ob die Funktion aus der dll geladen werden kann.
-
Ich habs geschafft. Habe das projekt noch mal neu angelegt und jetzt gehts, auch mit LoadLibrary da wo es steht.