Konvertieren VARIANTE...?
Hinweis:
- Der Versuch zum aufrufen einer Methode eines interfaces, von denen der Rückgabetyp ist
_variant_t
Code:
_variant_t resultsDataString;
_bstr_t simObjectNames;
simObjectNames = SysAllocString (L"TEST example 3");
resultsDataString = pis8->GetSimObject (simObjectNames);
inline-Funktion dargestellt unten, enthalten in .tli DATEI:
inline _variant_t IS8Simulation::GetSimObject ( _bstr_t Name ) {
VARIANT _result;
VariantInit(&_result);
HRESULT _hr = get_SimObject(Name, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _variant_t(_result, false);
}
Hinweis:
resultsDataString
iststruct
tagVARIANT
:VARTYPE vt
9 (unsigned short)IDispatch
IDispatch-Schnittstellenzeiger
Frage
- Wie kann ich dann konvertieren oder Extrakt den Wert?
- Möglich mit B. VariantChangeType?
- Anderen Weg?
Edit:
Hinweis:
-
Suchen transformieren Sie die folgenden Visual Basic-code in Visual C++
-
MFC oder ATL, wenn es sein muss
-
Ideal, reinen C++ -
Visual basic äquivalent:
Public example1, example2 As SIMUL8.S8SimObject
Dim numberOfexamples As Variant
Dim resultString As Variant
Set example1 = MySimul8.SimObject("Example 1")
Set example2 = MySimul8.SimObject("Example 2")
numberOfexamples = example1.CountContents + example2.CountContents
resultString = CStr(numberOfexamples) & "*"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es scheint, Sie sind mit C++ als COM-client, indem Sie sich auf die VC++ - compiler eingebaute COM-Unterstützung. Um die Kodierung der client "leichter", die Sie verwendet haben
#import
zum generieren von C++ - wrapper-Klassen, die versuchen zu verbergen alle COM-details von Ihnen - oder zumindest der COM-details einfacher. Du bist also nicht Verwendung der COM-SDK direkt, sondern über einen client-side-framework (ich denke, dass es sich wie eine light-weight-COM-nur-framework, ähnlich zu dem, ATL oder MFC).Deinem Beispiel-code, jedoch, scheint zu sein, das mischen der direkten low-level-COM-SDK (
VARIANT
sBSTR
,SysAllocString
) mit der#import
COM-framework (_variant_t
,_bstr_t
,XXXXPtr
). COM von C++ ist kompliziert auf den ersten - also in einer perfekten Welt würde ich vorschlagen, immer zu wissen, die Grundlagen von COM, bevor Sie gehen zu weit vorne.Jedoch, wenn Sie wollen einfach nur etwas, um zu arbeiten, ich würde denke dies ist
#import
-Stil-des-COM-clients version der VB-code, den Sie zur Verfügung gestellt:UPDATE:
Dokumentation auf
#import
Dies macht die Verwendung von COM-von C++ viel einfacher, aber ist noch eine andere Sache zu lernen...Werfen Sie einen Blick auf die MSDN-Dokumentation für _variant_t
Es ist ein ChangeType Methode sowie Abzieher.
Edit: Sobald Sie eine
IDispatch
Zeiger, die Sie verwenden müssenQueryInterface
um einen bestimmten Objekt-Typ mit-Mitglieder und-Methoden, oder verwenden SieIDispatch::Invoke
. Sie können sich auf der MSDN-Dokumentation fürIDispatch
. So oder so, Sie müssen wissen über das Objekt-Typ, der zurückgegeben wird, durch dieIS8Simulation::GetSimObject
nennen.Edit #2: Basierend auf Ihrer VB-code-update, die Sie verwenden möchten, die gleiche Art von code für C++, also das
S8SimObject
Typ in seiner C++ - form (schauen Sie in die generierten .tlh-Datei für_COM_SMARTPTR_TYPEDEF
). Dann können Sie direkt zu tun die gleiche Sache mitCountContents
. Ansonsten würden Sie brauchen, um sich dieCountContents
DISPID mitIDispatch::GetIDsOfNames
und dann rufen Sie invoke.Sie nicht haben, um konvertieren die
_variant_t
. Es enthält eineIDispatch
interface-Zeiger, so können Sie es wie diese:Gibt es ein Konzept der "Wert" eines Objekts (DISPID_VALUE).
Hier ist ein codeproject.com Artikel auf die überwindung von Varianten, die helfen könnten.