DLL und BCB
-
hi,
wenn ich mit dem BCB ne DLL erstelle in der ich mit new[] Speicher reserviere für objekte die ich per zeiger an die DLL uebergebe, dann bekomme ich beim Freigeben des Speichers von Codeguard den Fehler 'Bad parameter'.
hier mal ein vereinfachtes (aber vom ablauf her identisches) beispiel:
struct MyObject { unsigned char *Data; unsigned long Size; }; // in der DLL die exportierte funktion void BlahFun(MyObject *Object) { Object.Data = new unsigned char[100]; Object.Size = 100; } // in meinem programm typedef void (*PFUN_DLL_BLAHFUN) (MyObject *Object); PFUN_DLL_BLAHFUN BlahFun; // DLL laden und Funktionszeiger holen void __fastcall TForm1::ExecuteDLLFunction() { HINSTANCE DLLInst = ::LoadLibrary("my.dll"); BlahFun = (PFUN_DLL_BLAHFUN) ::GetProcAddress(DLLInst, "_BlahFun"); // neues objekt vom typ MyObject anlegen MyObject Object; if (BlahFun) BlahFun(&Object); // -> HIER KOMMT ES DANN ZUM FEHLER BEI CODE-GUARD delete [] Object.Data; }wenn ich die dynamisch RTL verwende (in der dll und im programm), dann kommt kein fehler.
kann ich diese dynamisch RTL nicht irgendwie umgehen? ich will nämlich nicht irgendwelche zusätzlichen borland-dlls beim anwender installieren müssen.
-
noch niemand was mit ner dll gemacht?
-
new und delete müssen immer in der selben Programmeinheit benutzt werden, also entweder beides im Hautprogramm oder beides in der DLL, aber NIEMALS(!!!) mischen.
Am besten du schreibst noch eine Delete-Funktion in die DLL, also
void DeleteObject(MyObject *Object) { delete [] Object; }Außerdem müssen in der Funktion "->" hin:
void BlahFun(MyObject *Object) { Object->Data = new unsigned char[100]; Object->Size = 100; }
-
danke...
genauso werde ich das jetzt auch machen. ist alles ziemlich umstaendlich fuer meinen geschmack.