如何使用_variant_t参数调用COM函数(键入“long”)?

时间:2013-04-02 12:23:19

标签: c# com interop com-interop

我想将某个函数调用移植到C#。这两行如下:

    m_pBrowserApp->get_Document(&pVoid);
    m_pLayoutAnalyzer->Analyze4(pVoid, _variant_t(5L));

m_pBrowserApp是ActiveX浏览器对象,pVoid是其文档属性。我可以通过致电WebBrowserBase.ActiveXInstance.Document来解决这个问题。但是,我不知道如何在C#中创建_variant_t(5L)。由于调用不是VT_BYREF,因此通过调用它来“应该正常工作”:

    ILayoutAnalyzer2 vips = new LayoutAnalyzer2();
    vips.Initialize(0);
    SHDocVw.WebBrowser_V1 axBrowser = (SHDocVw.WebBrowser_V1)this.webBrowser1.ActiveXInstance;
    var doc = axBrowser.Document as mshtml.HTMLDocument;

    vips.Analyze4(doc, (Object)5L); // fails with HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)

但事实并非如此。它失败并出现DISP_E_TYPEMISMATCH错误。 我很确定Document属性是有效的。所以问题仍然存在:如何通过互操作正确传递变量中的长变量?

1 个答案:

答案 0 :(得分:2)

变体可以追溯到20世纪90年代中期,当时人们考虑长时间使用32位。这是在第一个32位操作系统可用后的几年,例如VB6中的整数仍为16位。在C#和.NET中,情况并非如此,设计的32位编程环境从未必须处理16位反算法。所以使用C#int,而不是很长。

从文字中删除L.