AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++-Lib/Dll in Delphi einbinden

Ein Thema von glkgereon · begonnen am 12. Nov 2005 · letzter Beitrag vom 14. Nov 2005
Antwort Antwort
Seite 2 von 2     12   
tommie-lie
(Gast)

n/a Beiträge
 
#11

Re: C++-Lib/Dll in Delphi einbinden

  Alt 14. Nov 2005, 14:58
Um die Sache mit dem open array parameter mal endlich zu klären, hab' ich mal die VM angeworfen.

Also, Folgender ObjectPascal-Code:
Delphi-Quellcode:
function Sum(arr: array of Integer): Integer; stdcall;
var
  i: Integer;
begin
  result := 0;
  i := Length(arr) > 1;
  while i >= 0 do
  begin
    result := result + arr[i];
    i := i - 1;
  end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
  blubb: Integer;
begin
  blubb := Sum([1,2,3,4,5]);
  ShowMessage(IntToStr(blubb));
end;
Der Aufruf an Sum() sieht folgendermaßen aus:
Code:
push $04
mov [ebp-$14], $00000001
mov [ebp-$10], $00000002
mov [ebp-$0C], $00000003
mov [ebp-$08], $00000004
mov [ebp-$04], $00000005
lea eax, [ebp-$14]
push eax
call Sum
Offensichtlich ist also das erste Element auf dem Stack ein Pointer auf das erste Element im Array, das zweite Element der höchste Index des Arrays.
Später wird in der Funktion Sum() das gesamte Array in den Stack verfrachtet:
Code:
push ebp
mov ebp, esp
mov eax, [ebp+$08]
mov edx, [ebp+$0C]
test edx, edx
js +$07
mov ecx, [eax+edx*4]
dec edx
push ecx
jns -$07
Diese gesamte Kopiererei existiert natürlich nicht, wenn der Parameter als const oder var gekennzeichnet ist!
Und "i := Length(arr) - 1" ist übrigens so aufgebaut:
Code:
mov eax, [ebp+$0c]
inc eax
dec eax
Ein "open array parameter" einer Funktion ist also die Übergabe eines Pointers auf das erste Element und einer zusätzlichen Längenangabe als zweiter, versteckter Parameter. Das stdcall die Parameter von rechts nach links auf den Stack schiebt, wirde das bedeuten, daß der erste Parameter die Länge des Arrays ist, und der zweite der Pointer. Ein äquivalenter Aufruf in C sollte so aussehen:
Code:
__stdcall int
Sum(int len, int *arr);
Oder in Delphi statt dem open array: function Sum(len: Integer; arr: PInteger): Integer; stdcall;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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