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% Sie können TWideStringDynArray
verwenden und Delphi die Konvertierung machen lassen:
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%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:
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:
Wie auch immer, sobald Sie den SAFEARRAY
-Zeiger haben, verwenden Sie die SafeArray-API, um auf die BSTR
-Werte zuzugreifen, zB:
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:
Tags und Links safearray delphi c++builder bstr