代码之家  ›  专栏  ›  技术社区  ›  Aaron

将变量转换为…?

  •  2
  • Aaron  · 技术社区  · 17 年前

    • _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
      • IDispatch IDispatch接口指针

    问题

    编辑:

    注:

    • 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) & "*"
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   crashmstr    17 年前

    请查看MSDN文档中的 _variant_t

    有一个 ChangeType Extractors .

    编辑: IDispatch 指针,您需要使用 QueryInterface 获取具有成员和方法的特定对象类型,或使用 IDispatch::Invoke IDispatch . 无论哪种方式,您都需要知道 IS8Simulation::GetSimObject 呼叫

    编辑#2: 基于VB代码更新,您希望使用C++中的相同类型的代码,即使用 S8SimObject _COM_SMARTPTR_TYPEDEF ).然后你可以直接用它做同样的事情 CountContents . 否则,您需要查找 计数内容 与 IDispatch::GetIDsOfNames

        2
  •  2
  •   bluish dmajkic    13 年前

    #import 生成C++包装类,试图隐藏所有的COM细节,或者至少使COM细节更简单。所以你是 直接使用COM SDK,但使用的是客户端框架(我认为它类似于ATL或MFC的轻量级纯COM框架)。

    然而,您的示例代码似乎混合了直接的低级COM SDK( VARIANT s BSTR SysAllocString COM框架( _variant_t , _bstr_t , XXXXPtr 从C++开始,COM首先是复杂的,所以在一个完美的世界里,我建议在太过前行之前先了解COM的基本知识。

    猜测 这是 #进口 -COM客户端样式您提供的VB代码版本:

    _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变得更加容易,但是还有另外一件事要学习…

        3
  •  1
  •   Roger Lipscombe    17 年前

    这个 _variant_t . 它包含一个 IDispatch 接口指针,因此可以按如下方式将其导出:

    if (v.vt == VT_DISPATCH)
    {
        IDispatchPtr pDispatch = v.pdispVal;
        // Do something with pDispatch.
        // e.g. assign it to a strongly-typed interface pointer.
    }
    
        4
  •  0
  •   chrish    17 年前

    对象有一个“值”的概念(DISPID\u值)。

    这是一个 codeproject.com article