![]() |
DLL-Problem (bei dynamischer Einbindung)
Ich habe Probleme mit der Verwendung von DLLs.
Beim statischen Einbinden funktioniert dasselbe problemlos. Sobald das ganze dynamisch eingebunden wird, gibt es Probleme: entweder liefert die Funktion oder Müll zurück oder aber das ganze bricht mit einem Laufzeitfehler (mit Anzeige des CPU-Fensters) ab. Das ganze scheint sich also irgendwas im Speicher zu zerdeppern. Evtl. hat von Euch einer eine Idee, was ich da noch falsch mache ? Hier der Code der dll:
Delphi-Quellcode:
und hier die Funktion im aufrufenden Programm:
library TurnFkt;
uses SysUtils, Classes; {$R *.res} var ColCaption:string; function GetColCaption(ColName,Spezial:PChar): PChar;stdcall; begin ColCaption:=ColName; Result:=PChar(ColCaption); end; exports GetColCaption; begin end.
Delphi-Quellcode:
Als Anleitung habe ich das Dll-Tutorial von
function GetColCaption(ColName,Spezial:PChar): PChar;stdcall;
// external '../TurnFkt.dll'; type TGetColCaption=function(ColName,Spezial:PChar): pchar; var FGetColCaption:TGetColCaption; Handle : THandle; begin Handle:=LoadLibrary(Pchar('../TurnFkt')); if Handle<>0 then begin @FGetColCaption:=GetProcAddress(Handle,'GetColCaption'); if @FGetColCaption<>nil then Result:=FGetColCaption(ColName,Spezial); FreeLibrary(Handle); end; end; ![]() [edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt. Mfg, SirThornberry[/edit] |
Re: DLL-Problem (bei dynamischer Einbindung)
beim statichen einbinden hast du die Aufrufconvention (stdcall) angegeben, beim dynamischen nicht. Und genau da liegt der Fehler. Wenn dann so:
Delphi-Quellcode:
type TGetColCaption=function(ColName,Spezial:PChar): pchar; stdcall;
|
Re: DLL-Problem (bei dynamischer Einbindung)
Danke für den Hinweis, aber damit funktioniert es leider auch nicht.
|
Re: DLL-Problem (bei dynamischer Einbindung)
Hmm
Delphi-Quellcode:
Vielleicht so?
@FGetColCaption:=GetProcAddress(Handle,'GetColCaption'+#0);
Frank |
Re: DLL-Problem (bei dynamischer Einbindung)
hmm .. ich denke es liegt daran ...
Delphi-Quellcode:
Du bekommst einen Pointer auf eine Zeichenkette und speicherst den in Result.
if @FGetColCaption<>nil then
Result:=FGetColCaption(ColName,Spezial); FreeLibrary(Handle); Wenn du jetzt FreeLibrary aufruft wird der Pointer Zerstört und du bekommst nur noch Müll! probiers mal so:
Delphi-Quellcode:
function GetColCaption(ColName, Spezial: PChar): string;
type TGetColCaption = function(ColName, Spezial: PChar): PChar; var FGetColCaption : TGetColCaption; Handle : THandle; begin Handle := LoadLibrary(PChar('../TurnFkt')); if Handle <> 0 then begin @FGetColCaption := GetProcAddress(Handle, 'GetColCaption'); if @FGetColCaption <> nil then Result := FGetColCaption(ColName, Spezial)^; FreeLibrary(Handle); end; end; |
Re: DLL-Problem (bei dynamischer Einbindung)
Delphi-Quellcode:
Fehlt vielleicht nur die Endung? :D
Handle:=LoadLibrary(Pchar('../TurnFkt.dll'));
MfG freak |
Re: DLL-Problem (bei dynamischer Einbindung)
Delphi-Quellcode:
Gruß Frank
Handle:=LoadLibrary(Pchar('../TurnFkt.dll'));
|
Re: DLL-Problem (bei dynamischer Einbindung)
Zitat:
Dürfte nicht weiter relevant sein .. s. MSDN Zitat:
|
Re: DLL-Problem (bei dynamischer Einbindung)
stümmt, man lernt nie aus ;)
ist denn das Handle <>0? schonmal mit dem debugger geschaut? nicht dass er mit dem relativen Pfad nicht klar kommt... Gruß Frank |
Re: DLL-Problem (bei dynamischer Einbindung)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz