2013-04-02 33 views
1

我想将某个函数调用移植到C#。这两条线分别为:如何使用_variant_t参数(类型“long”)调用COM函数?

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属性是有效的。所以问题仍然存在:如何通过interop正确传递一个长变量?

+0

你有没有试过'vips.Analyze4(doc,5L);'?将其转换为对象应该会导致“VT_BYREF |”据我所知,VT_UNKNOWN'。所以它必须失败... – Carsten

+0

我有。 [同样的结果。](http://i.snag.gy/7LfV9.jpg) –

+0

就是这样!精彩!你可以再次发布这个答案,以便我可以标记它,@HansPassant? –

回答

2

变种可以追溯到20世纪90年代中期,这个时候长期考虑长32位。这只是第一个32位操作系统可用后的几年,例如VB6中的整数仍然是16位。在一般的C#和.NET中,并非如此,32位编程环境的设计从来不需要处理16位的back-compat。所以用一个C#int,不要太长。

从文字中删除L.

+0

当时的64位多头是“多头”。哦,痛苦。 –

相关问题