![]() |
DLL-Parameter: out VARIANT *
Hallo und sorry für den wenig aussagekräftigen Titel :-)
Ich möchte eine fertig Funktion aus einer DLL verwenden von der ich die Definition kenne, allerdings in C:
Code:
Mein DLL-Import sieht so aus:
INT QuerySQL(out VARIANT *outResult,INT DBHandle,PSTR sql)
Delphi-Quellcode:
Variants sind nicht wirklich meins, deswegen stehe ich da ein wenig auf dem Schlauch...
TQuerySQL = function(var outResult: PVariant; DBHandle: Integer; sql: PAnsiChar): Integer; stdcall;
Wenn ich nun die Funktion aufrufe:
Delphi-Quellcode:
Bekomme ich eine Reihe von AccessViolations... Was hab ich vergessen?
var
QuerySQL: TQuerySQL; begin LibHandle := LoadLibrary('XDB.DLL'); ... @QuerySQL := GetProcAddress(LibHandle, 'FB_DoSQL'); ... QuerySQL(MyResultP,MyHandle,'SELECT bla bla'); ShowMessage(VarTypeAsText(MyResultP^)); Liebe Grüße |
Re: DLL-Parameter: out VARIANT *
Delphi-Quellcode:
IN und OUT sind in C++ nur Hinweise auf die Datenrichtung und haben nix mit der Parameterbehandlungen VAR/CONST/OUT in Delphi gemeinsam.
function QuerySQL(out outResult: Variant; DBHandle: THandle; sql: PAnsiChar): Integer; stdcall;
PS: Um ein eventuelles Speicherleck zu vermeiden, (das OUT in C ruft gewisse Befürchtungen hervor, aufdaß ein eingehender Wert ignoriert/verworfen und nicht ordnungsgemäß freigegeben wird) setzte outResult vor Aufruf der Funktion auf NULL, falls in V schon etwas enthalten sein kann.
Delphi-Quellcode:
Wobei es nicht schaden kann, wenn du den Aufruf abkapselst ... z.B.:
uses Variants;
V := NULL; i := QuerySQL(V, DBHandle, sql);
Delphi-Quellcode:
function InternalQuerySQL(out outResult: Variant; DBHandle: Integer; sql: PAnsiChar): Integer; stdcall;
external 'deineDll.dll' name 'QuerySQL'; function QuerySQL(var outResult: Variant; DBHandle: THandle; sql: AnsiString): Integer; begin outResult := NULL; Result := InternalQuerySQL(outResult, DBHandle, PAnsiChar(sql)); end; |
Re: DLL-Parameter: out VARIANT *
Danke für den Ansatz,
die Fehlerquelle Aufruf hätt ich mir wirklich sparen können :D Fast wollte ich auch schon schreiben, dass das n Fehltritt war :wall: ABER: Es handelt sich tatsächlich um Variant und nicht um einen Zeiger auf einen Variant (PVariant), wie ich erst dachte. Vielen Dank, himitsu :-) |
Re: DLL-Parameter: out VARIANT *
Nicht so schlimm.
- wie gesagt, in/out kannst du erstmal ignorieren - "type *name" weißt auf einen Pointer hin, also "outResult: PVariant" oder delphitypischer als "var outResult: Variant" - durch das vorhin ignorierte "out" könnte man jetzt noch das "var" in "out" umwandeln, falls dieses passend wäre. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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