Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL-Parameter: out VARIANT * (https://www.delphipraxis.net/151624-dll-parameter-out-variant-%2A.html)

diabox 25. Mai 2010 19:31


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:
INT QuerySQL(out VARIANT *outResult,INT DBHandle,PSTR sql)
Mein DLL-Import sieht so aus:
Delphi-Quellcode:
TQuerySQL = function(var outResult: PVariant; DBHandle: Integer; sql: PAnsiChar): Integer; stdcall;
Variants sind nicht wirklich meins, deswegen stehe ich da ein wenig auf dem Schlauch...
Wenn ich nun die Funktion aufrufe:
Delphi-Quellcode:
var
QuerySQL: TQuerySQL;
begin
LibHandle := LoadLibrary('XDB.DLL');
...
@QuerySQL := GetProcAddress(LibHandle, 'FB_DoSQL');
...
QuerySQL(MyResultP,MyHandle,'SELECT bla bla');
ShowMessage(VarTypeAsText(MyResultP^));
Bekomme ich eine Reihe von AccessViolations... Was hab ich vergessen?

Liebe Grüße

himitsu 25. Mai 2010 19:50

Re: DLL-Parameter: out VARIANT *
 
Delphi-Quellcode:
function QuerySQL(out outResult: Variant; DBHandle: THandle; sql: PAnsiChar): Integer; stdcall;
IN und OUT sind in C++ nur Hinweise auf die Datenrichtung und haben nix mit der Parameterbehandlungen VAR/CONST/OUT in Delphi gemeinsam.

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:
uses Variants;

V := NULL;
i := QuerySQL(V, DBHandle, sql);
Wobei es nicht schaden kann, wenn du den Aufruf abkapselst ... z.B.:
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;

diabox 25. Mai 2010 20:43

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

himitsu 25. Mai 2010 20:50

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 11:02 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