【问题标题】:How do I call a COM-function with a _variant_t parameter (type "long")?如何使用 _variant_t 参数(类型“long”)调用 COM 函数?
【发布时间】:2013-03-23 17:49:51
【问题描述】:

我想将某个函数调用移植到 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 属性是有效的。所以问题仍然存在:如何通过互操作正确传递一个长包装的变体?

【问题讨论】:

  • 你试过vips.Analyze4(doc, 5L);吗?据我记得,将其转换为对象应该会导致 VT_BYREF | VT_UNKNOWN。所以它一定会失败......
  • 我有。 Same result.
  • 就是这样!精彩的!你能再把它作为答案发布,以便我标记它,@HansPassant 吗?

标签: c# com interop com-interop


【解决方案1】:

变体可以追溯到 1990 年代中期,当时 long 被认为是 long 以具有 32 位。这只是在第一个 32 位操作系统面世之后的几年,例如,在 VB6 中整数仍然是 16 位。通常在 C# 和 .NET 中并非如此,32 位编程环境的设计从不需要处理 16 位向后兼容。所以使用 C# int,而不是 long。

从文字中去掉 L。

【讨论】:

  • 当时 64 位 long 是“long long”。哦,痛苦。
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 2010-09-18
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2020-09-21
相关资源
最近更新 更多