Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 30. Jan 2006, 20:37
Zitat von mika:
Da ich die Aufrufkonvention jetzt ja auf cdecl geändert habe muss ich mich doch auch im "Aufrufenden" Programm
um die Speicherverwaltung der Parameter kümmern oder?
Nein. Das macht der Compiler für dich. Bei DLLs ist unter Windows StdCall geläufiger als Cdecl.

Zitat:
Die Methode die aufgerufen wird sieht folgendermaßen aus:
Delphi-Quellcode:
Function PassParamFunction(Var Parameter: TParamStructure): Double; cdecl;
Var
  Wert1,
  Wert2,
  Wert3,
  Wert4: Double;
Begin
  Wert1 := Parameter.one;
  Wert2 := Parameter.two;
  Wert3 := Parameter.three;
  Wert4 := Parameter.four;
  Result := 0;
End
Ich gehe mal davon aus, dass das nur ein Pseudo-Code ist, denn der Compiler wird dir da einiges wegoptimieren, weil es Unnütz ist.

Zitat:
In meinem Testprogramm das die DLL aufruft ist in meiner "Api"-Unit folgendes angelegt!
Delphi-Quellcode:
PParameterStructure = ^TParameterStructure;
TParameterStructure = Record
  one,
  two,
  three,
  four: double;
End;

Function PassParamFunction(Var Parameter): Double; cdecl;

implementation

Function PassParamFunction(Var Parameter): Double; cdecl; external 'test.dll';
Da es sich um eine Delphi-Unit handelt, kannst du auch beim "Var Parameter" den Typ mit angeben. Dann kann schon mal nichts mehr mit falschen Parametern schief laufen, was du ja im nächsten Code-Block gliech mal falsch machst.

Zitat:
Und bei dem Button mit dem ich den ganzen Kram teste:
Deine Funktion möchte einen TParamStructure in der DLL. Da du aber diese Information in der Import-Unit verheimlichst und ein allgemeingültigen veränderbaren Parameter möchtest, akzeptiert der Compiler hier natürlich auch einen Zeiger(Var) auf einen Zeiger auf eine TParamStructure, was aber falsch ist, denn die DLL mag ja nur einen Zeiger(Var) auf eine TParamStructure. Also ein "Zeiger auf" weniger.

Das mit dem GetMem/FreeMem kannst du dir auch sparen, wenn du einfach eine lokale Variable vom Typ TParamStructure anlegst. Damit ist auch gleich sichergestellt, dass du kein Speicherleck produzierst.


Die Import-Unit muss also besser so aussehen:
Delphi-Quellcode:
type
  PParameterStructure = ^TParameterStructure;
  TParameterStructure = record
    One,
    Two,
    Three,
    Four: Double;
  end;

function PassParamFunction(var Parameter: TParameterStructure): Double; cdecl;

implementation

function PassParamFunction(var Parameter: TParameterStructure): Double; cdecl; external 'test.dll';
Und wenn du die ParameterStructure-Felder nicht verändern willst, kannst du aus dem "var" auch ein "const" machen (dann aber auch in der DLL daraus ein "const" machen).
  Mit Zitat antworten Zitat