如何在C++中将结构转换为VARIANT

How to convert a structure to VARIANT in C++

本文关键字:结构 转换 VARIANT C++      更新时间:2023-10-16

我想将C++中的一个结构传递给javascript函数。我可以将VARIANT变量传递给javascript,但我不知道如何将结构转换为VARIANT。

例如,我可以将转换为VARIANT:的字符串传递给function f

void f(VARIANT x);  
f(_variant_t("hello!"));

现在我想通过这样一个结构:

struct TMyStruct
{
  int x;
  int y;
};

-------我的部分代码如下:

// Load Html on CHtmlView and after load is completed, get its document.
LPDISPATCH pDoc = ... // document of CHtmlView
CComQIPtr<IHTMLDocument2> m_pViewDoc;
pDoc->QueryInterface(IID_IHTMLDocument2, (void**)&m_pViewDoc);
CComPtr<IDispatch> m_pScript;
m_pViewDoc->get_Script(&m_pScript);
struct TMyStruct
{
    int x;
    int y;
    // .... other fields...
} z;
//z = .... Initialize z.
VARIANT myVariant;
// myVariant = z ????   // How to pass z to variant.
DISPID dispid = NULL;
HRESULT hr = m_pScript->GetIDsOfNames(IID_NULL, &CComBSTR(myJavaScriptFunctionName), 1, LOCALE_SYSTEM_DEFAULT, &dispid);
ATLASSERT(SUCCEEDED(hr));
if(SUCCEEDED(hr))
{
    COleDispatchDriver ocOleDispatchDriver(pScript, FALSE);
    ocOleDispatchDriver.InvokeHelperV(dispid, DISPATCH_METHOD, VT_NONE, nullptr, (BYTE*)VTS_VARIANT, myVariant);
}

此页面表示您无法执行您想要执行的操作。

重要提示:结构不能由脚本客户端使用!

参考:http://vcfaq.mvps.org/com/4.htm

在我看来,你已经进入了COM的世界,但你仍然很不确定这一切是如何运作的。从根本上讲,COM需要了解您传递的类型,因为它强制执行和管理COM Apartments之间的转换。当跨越单元边界时,COM子系统将发挥一些神奇的作用,以确保遵守COM规则,不会发生任何(太)糟糕的事情。除非某个地方有接口或类型的描述,否则它无法发挥这种魔力。因此,当将结构从一个C++类传递到另一个C++类时,您可以选择一些选项来实现这一点,但在尝试将数据传递到脚本客户端时,您可能没有那种级别的控制。