将VARIANT转换为...? [英] Convert VARIANT to...?

查看:451
本文介绍了将VARIANT转换为...?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意




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

    编辑:



    注意:




    • 希望将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 of struct 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 (VARIANTs, 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆