gpt4 book ai didi

c++ - 将 VARIANT 转换为...?

转载 作者:可可西里 更新时间:2023-11-01 09:57:13 29 4
gpt4 key购买 nike

注意:

  • 试图调用一个返回类型为_variant_t的接口(interface)方法

代码:

_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)指针

问题

  • 然后如何转换提取值(value)?
  • 可能使用 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 之前先了解 COM 的基础知识。

但是,如果您只是想让某些东西起作用,我会猜测这是 #import-style-of-COM-clients 版本您提供的 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 变得更加容易,但又是另一回事需要学习...

关于c++ - 将 VARIANT 转换为...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/606527/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com