将VARIANT转换为...? [英] Convert VARIANT to...?
问题描述
注意:
- 尝试调用接口的方法,返回类型为
_variant_t
代码: b
$ b
_variant_t resultsDataString;
_bstr_t simObjectNames;
simObjectNames = SysAllocString(LTEST example 3);
resultsDataString = pis8-> GetSimObject(simObjectNames);包含在 .tli 中的
FILE:
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);
}
请注意:
-
resultsDataString
是struct
tagVARIANT
:
-
VARTYPE vt
是9(无符号短整型) -
IDispatch
$ b $ b- 我如何可以转换或提取该值?
- VariantChangeType ?
- 另一个方式?
编辑:
注意:
-
希望将Visual Basic代码转换为Visual C ++
-
MFC或ATL,如果需要
-
理想情况下,纯C ++
视觉基本当量:
example2 As SIMUL8.S8SimObject
Dim numberOfexamples As Variant
Dim resultString As Variant
设置示例1 = MySimul8.SimObject(示例1)
设置示例2 = MySimul8。 SimObject(Example 2)
numberOfexamples = example1.CountContents + example2.CountContents
resultString = CStr(numberOfexamples)& *
解决方案COM客户端通过依靠VC ++编译器的内置COM支持。为了使客户端的编码更容易,你已经使用
#import
来生成C ++包装类,试图隐藏所有的COM细节 - 或者至少使COM细节更简单。所以你不是 直接使用COM SDK,而是使用客户端框架(我认为它像一个轻量级的COM-only框架类似于ATL或MFC)。
然而,您的示例代码似乎混合了直接低级COM SDK(
VARIANT
s,( C> BSTR
,SysAllocString
c> _variant_t ,_bstr_t
,XXXXPtr
)。 COM从C ++开始是复杂的 - 所以在一个完美的世界中,我建议在走得太远之前,了解COM的基本知识。
但是,如果你只是想某事工作我会猜测 这是
#import
-style-of-COM-clients版本的VB代码您提供:_variant_t example1Var;
_variant_t example1Var;
SIMUL8 :: S8SimObjectQIPtr example1; //我从VB代码猜到这个类型名称
SIMUL8 :: S8SimObjectQIPtr example2;
example1Var = pis8-> GetSimObject(_bstr_t(LExample 1));
example2Var = pis8-> GetSimObject(_bstr_t(LExample 2));
if(example1Var.vt == VT_DISPATCH&& example2Var.vt == VT_DISPATCH)
{
// ** UPDATE **尝试勺子喂QI ptr ...
example1 = IDispatchPtr((IDispatch *)example1Var);
example2 = IDispatchPtr((IDispatch *)example2Var);
//这个拧紧引用计数吗?
int numberOfexamples = example1-> CountContents + example2-> CountContents;
}
UPDATE:
上的文档# import
这使得从C ++使用COM更容易,但还有一件事要学习...Note:
- Attempting to invoke a method of an interface, of which the return type is
_variant_t
Code:
_variant_t resultsDataString; _bstr_t simObjectNames; simObjectNames = SysAllocString (L"TEST example 3"); resultsDataString = pis8->GetSimObject (simObjectNames);
inline function illustrated below, contained in .tli FILE:
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); }
Note:
resultsDataString
is ofstruct
tagVARIANT
:VARTYPE vt
is 9 (unsigned short)IDispatch
IDispatch interface pointer
Question
- How can I then convert or extract the value?
- Possible using VariantChangeType?
- Another way?
Edit:
Note:
Looking to transform the following, Visual Basic code to Visual C++
MFC or ATL, if need be
Ideally, pure C++
Visual basic equivalent:
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) & "*"
解决方案It appears you are using C++ as a COM client by relying on the VC++ compiler's built-in COM support. To make coding the client "easier" you've used
#import
to generate C++ wrapper classes that attempt to hide all the COM details from you - or at least make the COM details simpler. So you're not using the COM SDK directly, but are using a client-side framework (I think of it like a light-weight COM-only framework akin to ATL or MFC).Your example code, however, seems to be mixing the direct low-level COM SDK (
VARIANT
s,BSTR
,SysAllocString
) with the#import
COM framework (_variant_t
,_bstr_t
,XXXXPtr
). COM from C++ is complicated at first - so in a perfect world I would suggest getting to know the basics of COM before going too far forward.However, if you just want something to work I would guess this is
#import
-style-of-COM-clients version of the VB code you provided:_variant_t example1Var; _variant_t example1Var; SIMUL8::S8SimObjectQIPtr example1; // I'm guessing at this type-name from the VB code SIMUL8::S8SimObjectQIPtr example2; example1Var = pis8->GetSimObject(_bstr_t(L"Example 1")); example2Var = pis8->GetSimObject(_bstr_t(L"Example 2")); if (example1Var.vt == VT_DISPATCH && example2Var.vt == VT_DISPATCH) { // **UPDATE** to try to spoon feed the QI ptr... example1 = IDispatchPtr((IDispatch*)example1Var); example2 = IDispatchPtr((IDispatch*)example2Var); // Does this screw-up reference counting? int numberOfexamples = example1->CountContents + example2->CountContents; }
UPDATE:
Documentation on#import
This makes using COM from C++ much easier, but is yet one other thing to learn...这篇关于将VARIANT转换为...?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
-