Probleme mit String aus DLL zurückgeben
-
Ich habe ein Programm und eine DLL die mir die Versionsnummer zurückgeben soll. Dort treten aber probleme auf. Sobald in der DLL auch eine Form mit VCL hinzugefügt wurde gibt es eine Fehlermeldung bei Versionsnummer auslesen.
Zugriffsverletzung bei Adresse 0044B1A2 in Modul 'Mein Programm.exe'. Schreiben von Adresse 00BDA6DC
Es reicht nur eine Form in die DLL einzubinden. Es muss nichts weiter damit gemacht werden. Nehem ich sie wieder raus geht alles. Warum??? Kann das nicht nachvollziehen.
Programm
//--------------------------------------------------------------------------- String ModulVersionFunktion(String PluginData) { String Erg = 0; if(FileExists(PluginData)) { TDLLModulVersion* DLLModulVersion; HINSTANCE h = LoadLibrary(PluginData.c_str()); if(h != 0) DLLModulVersion = (TDLLModulVersion*)GetProcAddress(h, "_ModulVersion"); if(DLLModulVersion != NULL) Erg = DLLModulVersion(); else Erg = 0; FreeLibrary(h); } return Erg; } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { Caption = ModulVersionFunktion(ExtractFilePath(ParamStr(0)) + ListBox1->Items->Strings[ListBox1->ItemIndex]); } //--------------------------------------------------------------------------- in h typedef String TDLLModulVersion();DLL
extern "C" __declspec(dllexport) String ModulVersion() { return "v0.0.0.0"; } //---------------------------------------------------------------------------
-
also hier kann ich den fehler nicht genau sagen, aber die verwendung der vcl in dlls kann oft zu problemen führen!
arbeite in den dlls doch lieber mit pods
-
Sollte vieleicht noch dazu sagen das der String auch übergeben wird nur die Fehlermeldung kommt zusätzlich.
-
Habe die meldung jetzt mit try catch unterdrückt. Geht anscheinend nicht anders.
Trotzdem Danke.
-
Wie sieht denn der Gültigkeitsbereich der Variable "Erg" aus?
-
Verdammt schlecht würde ich sagen. @gjfj: Ich hatte mir bis dato angewöhnt, bei DLLs mit reinen C-interfaces zu versehen, um die INteroperabilität mit anderen Anwendungen sicherzustellen. In so einem fall wäre der korrekte Weg eine Übergabe eines Zeiger welcher auf einen von der Applikation die die DLL verwendet allokierten Speicherbereich zeigt. Zusätzlich natürlich noch die Grösse des Speicherbereichs in Byte. Deine DLL Funktion befüllt dann diesen Speicherbereich mit dem Resultat. Den Rückgabewert kannst du dann dazu verwenden, um zum Beispiel darauf aufmerksam zu machen, dass der reservierte Speicher zu klein war. Oder um einfach die überleibende Anzahl von Bytes zurück zu geben. Dies würde dann einen ersten aufruf mit einem NULL Zeiger ermöglichen um die korrekte Länge des Strings zu ermitteln.
Ansonsten fällt mir nur ein, dass beim Erzeugen von DLLs welche VCL-Klassen (wie String) verwenden noch oben im Kommentar was steht, man solle memmgr.lib oder sowas einbinden. Einfach mal genau das lesen, was schon in der Datei stand als Kommentar, wenn man eine DLL neu generiert.
-
@junix
Habe das jetzt mal auf ShortString geändert.
Bekomme aber immer die fehlermeldung, jedoch nur wenn ich vom Builder aus starte. Wenn ich die exe so starte komme keine meldung mehr. Habe gemerkt das dies daran liegt das ich die DLL mit UPX gepackt habe. Das schein wohl in diesem fall nicht so gut zu sein.
-
gjfj schrieb:
Habe das jetzt mal auf ShortString geändert.
Kein mir bekannter C-Datentyp. ALso kanns nur eine weitere VCL oder ne selbstgebastelte Klasse sein. Was wiederum die Frage aufwirft, wieso du nach obigen Ausführungen auf die Idee kommst, dass es plötzlich besser sein sollte?
Bekomme aber immer die fehlermeldung, jedoch nur wenn ich vom Builder aus starte. Wenn ich die exe so starte komme keine meldung mehr.
Könnte wohl daran liegen, dass nur wenn die Applikation in einem Debugger gestartet wird, welcher jeden Speicherzugriff verfolgt auch diagnostiziert werden kann, dass der Code scheisse baut. Lässt man diese Sandbox weg, macht die Applikation hald irgendwas das vielleicht zufällig richtig ist, das Verhalten aber definitiv unvorhersehbar bleibt. Also sei bitte so gut, und betreib keine Sympotmtherapie mit deiner applikation indem du nur die Fehlermeldungen unterdrückst...!
-
OK, dann werde ich wohl noch ein bisschen Arbeit vor mir haben und lieber alles noch mal durchgehen. Gut fand ich das mit der unterdrückung auch nicht. Bedanke mich erstmal für die Hilfe aber den rest werde ich wohl nur alleine schaffen können. Das mit ShortString stand im Kommentar bei einer neu generierten DLL.
-
Stand da nicht auch was zum Einbinden einer Lib?