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

3
我可以帮您将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);
}

你必须先从结构中构建一个Javascript对象。不知道你使用的是哪个Javascript库,无法准确说明如何实现。 - Emil Styrke
3
这里关于C++如何与Javascript进行接口编程的信息远远不足,VARIANT是什么?所谓的“结构”是指什么?请提供更多信息。 - Lightness Races in Orbit
你是在谈论 COM 编程中使用的 VARIANT 结构吗?这与 JavaScript 有什么关系? - Cody Gray
代码格式化比加粗要好得多,它甚至可以给你语法高亮。我投票重新打开,但答案是您需要使用IDL文件才能将用户定义的类型作为“VARIANT”传递。 - Cody Gray
1个回答

2

这个页面似乎表明你无法完成你正在尝试做的事情。

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

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

看起来你已经进入了COM世界,但仍然不太确定它是如何工作的。从根本上讲,COM需要知道你传递的类型,因为它强制执行和管理称为COM公寓的东西之间的转换。当跨越公寓边界时,COM子系统会进行一些魔法以确保遵循COM规则并且不会发生太糟糕的事情。除非接口或类型的描述可用,否则它无法执行该操作。因此,在将结构体从一个C++类传递到另一个C++类时,您有一些选项可以促进此过程,但是在尝试将数据传递给脚本客户端时,您可能没有那种级别的控制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接