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/)
-   -   Zugriff auf PSafeArray über Late Binding (https://www.delphipraxis.net/160148-zugriff-auf-psafearray-ueber-late-binding.html)

Dawn87 29. Apr 2011 17:36

Zugriff auf PSafeArray über Late Binding
 
Hallo,

ich binde ein COM-Objekt über Late Binding (also über CreateOleObject()) ein. Dieses COM-Objekt enthält eine Funktion die ein PSafeArray zurückgibt.

Wenn ich dieses Array zwischenspeichern möchte um darauf zuzugreifen, erhalte ich den Fehler "Inkompatible Typen: PSafeArray und Variant".

Mein Code sieht folgendermaßen aus:
Delphi-Quellcode:
var
  f: PSafeArray;
begin
  f := FComObj.GetToolList;
end;
wobei FComObj vom Typ OleVariant ist und das COM-Objekt darstellt.

Hat jemand eine Idee wie ich an die Inhalte vom SafeArray komme?

Grüße
Dawn

mkinzler 29. Apr 2011 17:40

AW: Zugriff auf PSafeArray über Late Binding
 
Delphi-Quellcode:
var
  f: OleVariant;
begin
  f := FComObj.GetToolList;
end;

Dawn87 29. Apr 2011 17:43

AW: Zugriff auf PSafeArray über Late Binding
 
Hallo,

erst einmal vielen Dank für deine Antwort.

Was ich vielleicht noch erwähnen sollte:

Ich möchte u. A. mit SafeArrayGetElement() auf die Inhalte des Arrays zugreifen. Diese Funktion erwartet eine Variable vom Typ PSafeArray. Wenn ich nun das Array in einem OleVariant unterbringe, fehlt noch eine Typenkonvertierung. Daran scheiter ich gerade.

Hast Du vielleicht noch einen Tipp?

Grüße
Dawn

mkinzler 29. Apr 2011 17:50

AW: Zugriff auf PSafeArray über Late Binding
 
Funktioniert ein Cast
Delphi-Quellcode:
  f := PSafeArray(FComObj.GetToolList);
?

Bummi 29. Apr 2011 17:50

AW: Zugriff auf PSafeArray über Late Binding
 
ich habe keine Ahnung von Deinem Comobj, etwas in der Art

FComObj.GetToolList.SafeArrayGetElement()

oder

SafeArrayGetElement(FComObj.GetToolList,xxx)

geht nicht ?

PSafeArray klingt nach Pointer ...

Dawn87 2. Mai 2011 08:49

AW: Zugriff auf PSafeArray über Late Binding
 
Lösung:

Folgende Funktion schafft Abhilfe:

Delphi-Quellcode:
function VariantToSafeArray(const Arr: OleVariant): PSafeArray;
begin
    Assert(TVarData(Arr).VType=varArray);

    Result:=PSafeArray(TVarData(Arr).VArray);
end;
Gefunden auf:
http://www.experts-exchange.com/Prog..._20178900.html

himitsu 2. Mai 2011 09:50

AW: Zugriff auf PSafeArray über Late Binding
 
Besser noch Delphi-Referenz durchsuchenVarArrayAsPSafeArray, gefunden in der Unit Variants. :wink:

Oder Delphi-Referenz durchsuchenSafeArrayGetElement und Co. (Unit VarUtils und sie fangen alle mit SafeArray... an)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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