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).