So zeigen Sie Werte von einem VARIANT mit einem SAFEARRAY von BSTRs an

8

Ich arbeite an einer COM-Objektbibliothek mit Funktion, die ein VARIANT mit einem SAFEARRAY von BSTR s zurückgibt. Wie kann ich die Werte dieser VARIANT -Instanz anzeigen und sie in einem TStringList speichern? Ich habe versucht, das Netz ohne klare Antwort zu durchsuchen.

Ich habe folgendes ohne Erfolg versucht:

%Vor%     
Heb 19.12.2011, 07:33
quelle

3 Antworten

4

Sie können TWideStringDynArray verwenden und Delphi die Konvertierung machen lassen:

%Vor%

Wenn Sie dies mit Ihrem Variant-Safearray von BSTRs aufrufen, wird es automatisch in TWideStringDynArray konvertiert. Eine inkompatible Variante verursacht den Laufzeitfehler EVariantInvalidArgError .

Um zu überprüfen, ob eine Variante ein sicheres BSTR-Array enthält, können Sie dies tun:

%Vor%     
Ondrej Kelle 19.12.2011 08:27
quelle
4
%Vor%

Wenn Sie ComFunction über die späte Bindung ( CreateOleObject ) erstellen, sollten Sie Folgendes verwenden:

%Vor%     
kobik 19.12.2011 11:01
quelle
2
  

Wie kann ich die Werte dieser VARIANT-Instanz anzeigen und sie in einer TStringList speichern?

Die COM VARIANT struct hat parray und pparray Datenelemente, die Zeiger auf ein SAFEARRAY sind, zB:

%Vor%

Die Klasse VCL Variant dagegen hat einen LPSAFEARRAY Konvertierungsoperator definiert, so dass Sie ihn direkt zuweisen können (aber nur, wenn das Variant.VType -Feld, das nicht das varByRef -Flag hat, das ist ist), zB:

%Vor%

Wie auch immer, sobald Sie den SAFEARRAY -Zeiger haben, verwenden Sie die SafeArray-API, um auf die BSTR -Werte zuzugreifen, zB:

%Vor%
  

VarClear (V);   TVarData (V). VType = varOleStr;

Sie brauchen diese überhaupt nicht. Die VCL Variant -Klasse initialisiert sich selbst zu einem leeren Zustand, und es ist nicht notwendig, VType zuzuordnen, da Sie unmittelbar danach einen neuen Wert für die gesamte Variant zuweisen.

  

V = ComFunction- & gt; GetValues ​​(); // & lt; & lt; & lt; & lt; ----- V ist leer

Wenn V leer ist, gibt GetValues() ein leeres Variant zurück, um damit zu beginnen.

  

mystr = (wchar_t *) (TVarData (V) .VString);

TVarData::VString ist ein AnsiString& Verweis, kein wchar_t* Zeiger. Um eine VCL Variant (nicht eine COM VARIANT ) in eine String zu konvertieren, einfach zuweisen wie sie ist und lassen Sie die RTL das Detail für Sie ausarbeiten:

%Vor%     
Remy Lebeau 20.12.2011 09:41
quelle

Tags und Links