注意:
_variant_t
代码:
_variant_t resultsDataString;
_bstr_t simObjectNames;
simObjectNames = SysAllocString (L"TEST example 3");
resultsDataString = pis8->GetSimObject (simObjectNames);
内联函数包含在 .tli 文件中,在下面说明了:
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
IDispatch接口(interface)指针问题
编辑:
注意:
等效的Visual Basic :
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) & "*"
最佳答案
看来您是依靠VC++编译器的内置COM支持来将C++用作COM客户端的。为了使客户端的编码更加“容易”,您已使用#import
生成C++包装器类,这些类试图向您隐藏所有COM详细信息-或至少使COM详细信息更简单。因此,您不是直接使用COM SDK,而是使用客户端框架(我认为它像类似于ATL或MFC的轻量级纯COM框架)。
但是,您的示例代码似乎将直接的低级COM SDK(VARIANT
,BSTR
,SysAllocString
)与#import
COM框架(_variant_t
,_bstr_t
,XXXXPtr
)混合在一起。从C++开始的COM首先是很复杂的-因此,在一个完美的世界中,我建议您先了解COM的基础知识,然后再进行进一步的研究。
但是,如果您只想工作,我会猜测,这是您提供的VB代码的#import
-COM-style-COM-clients版本:
_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;
}
更新:
Documentation on
#import
这使得从C++使用COM变得更加容易,但这是另一件事需要学习...