注意:

  • 尝试调用接口(interface)的方法,该方法的返回类型为_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)指针

  • 问题
  • 然后如何转换提取值?
  • 可以使用VariantChangeType吗?
  • 另一种方法?

  • 编辑:

    注意:
  • 希望将以下Visual Basic代码转换为Visual C++
  • MFC或ATL(如果需要)为
  • 理想情况下,纯C++

  • 等效的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(VARIANTBSTRSysAllocString)与#import COM框架(_variant_t_bstr_tXXXXPtr)混合在一起。从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变得更加容易,但这是另一件事需要学习...

    07-24 09:44
    查看更多