![]() |
DLL werte übergabe
Hi,
ich fast am verzweifeln, ich habe eine DLL Funktion der ein Integer wert übergeben wird bei der DLL kommt aber immer 1243288 an. egal welchen wert am einstzt. DLL:
Delphi-Quellcode:
Programm:
...
function init(const ah, fh: integer;const pa:TPointerArray;const sendmsg: Pointer): integer; stdcall; begin showmessage(inttostr(fh)); // immer immer 1243288 feditor:= Tfeditor.Create(application); Windows.SetParent(feditor.Handle, fh); // ungültiges handle da immer 1243288 feditor.Show; end; exports init; ...
Delphi-Quellcode:
Leider habe ich keine erklärung für den Fehler ich hoffe ihr könnt mir helfen.
...
type TTaskInit = function (const ah, fh: integer;const pa:TPointerArray;const sendmsg: Pointer): integer; ... procedure Tfmain.loadtask(name: string); var h: integer; ti: TTaskInit; begin // Überprüfen ob task vorhanden ist wenn nicht abbrechen if not fileexists(pfad+name+DLLEXT) then begin exit; showmessage('Task "'+name+'" konnte nicht geladen werden.'+BR+BR+'Datei "'+pfad+name+DLLEXT+'" konnte nicht gefunden werden.'); end; h:= LoadLibrary(pchar(pfad+name+DLLEXT)); if h<>0 then begin @ti := GetProcAddress(h, 'init'); if @ti <> nil then begin showmessage(inttostr(fmain.Handle));// hier ist der wert richtig ti(application.Handle, fmain.Handle, [nil], nil);// was läuft da falsch end else begin showmessage('Task "'+name+'" konnte nicht geladen werden.'+BR+BR+'Function "init" wurde in der DLL nicht gefunden') end; end else begin showmessage('Task "'+name+'" konnte nicht geladen werden.'+BR+BR+'DLL-Handle ist 0'); end; FreeLibrary(h); end; ... thx, arbu |
Re: DLL werte übergabe
Irgendwas stimmt da in meinen Augen mit dem stdcall; nicht. Bist du sicher, dass du das in einer Pascal - DLL brauchst? Und wenn, warum fehlt das dann in deinem Programm?
|
Re: DLL werte übergabe
Danke ohne stdcall; klappt es :-D
Was bedeutet stdcall eigentlich ? |
Re: DLL werte übergabe
stdcall; übergibt die Parameter einer Funktion von rechts nach links. Das ist z.B. für die System - DLL's notwendig. Das hat imho was mit C/C++ zu tun. Die Parameterübergabe einer Funktion in Delphi geht ja bekanntlich von links nach rechts, d.h. wenn du mit einem Pascal Programm eine Funktion aus einer C/C++ - DLL aufrufen willst, musst du die Funktion in deinem Programm mit einem "stdcall;" dahinter deklarieren, damit die Parameter der DLL in der richtigen Reihenfolge übergeben werden. Äääh.... Verständlich?
//Edit: Oder um es kurz mit den Worten der OH zu sagen: "Die Konventionen register und pascal übergeben Parameter von links nach rechts. Der links stehende Parameter wird also zuerst ausgewertet und übergeben, der rechts stehende Parameter zuletzt. Die Konventionen cdecl, stdcall und safecall übergeben die Parameter von rechts nach links." |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 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