Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL werte übergabe (https://www.delphipraxis.net/70252-dll-werte-uebergabe.html)

arbu man 27. Mai 2006 18:15


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:
...
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;
...
Programm:
Delphi-Quellcode:
...
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;
...
Leider habe ich keine erklärung für den Fehler ich hoffe ihr könnt mir helfen.

thx, arbu

Daniel G 27. Mai 2006 18:24

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?

arbu man 27. Mai 2006 18:32

Re: DLL werte übergabe
 
Danke ohne stdcall; klappt es :-D

Was bedeutet stdcall eigentlich ?

Daniel G 27. Mai 2006 18:41

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 08:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz