![]() |
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:
|
Re: DLL-Problem (bei dynamischer Einbindung)
Aslo bei PChar gehen bei mir immer die Alamglocken los bezüglich Speicherreservierung. Und die Fragezeichen scheinen ja daraufhinzudeuten, dass da was nicht stimmt.
|
Re: DLL-Problem (bei dynamischer Einbindung)
meine weiteren Tests weisen auf die Meinung von ACE-ppc (und auch Luckie) hin.
|
Re: DLL-Problem (bei dynamischer Einbindung)
Hallo,
ich würde ganz auf die DLL-Variable verzichten, und einen Pointer (ev. noch mit Längenangabe übergeben).
Delphi-Quellcode:
Beim Aufruf könnte man jetzt entweder String (SetLength nicht vergessen)
library TurnFkt;
uses SysUtils, Classes; {$R *.res} function GetColCaption(ColName,Spezial:PChar; ColCaption: PChar, ColCaptionSize: Integer): Boolean;stdcall; begin StrLCopy(ColName, 'bla', ColCaptionSize); Result:= True; end; exports GetColCaption; begin end. oder nen array of Char benutzen. Heiko |
Re: DLL-Problem (bei dynamischer Einbindung)
Mit Hoikas Hilfe habe ich das inzwischen hinbekommen, vielen Dank.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 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