【问题标题】:Calling C++ COM-server function from C# client从 C# 客户端调用 C++ COM-server 函数
【发布时间】:2017-12-19 22:53:36
【问题描述】:

寻求有关 C++ 上 com 服务器的帮助。

这里是调用方法的 C# 客户端代码:

public static object ComInvoke(string method, params object[] args)
{
    return _comObj.GetType().InvokeMember(method, BindingFlags.InvokeMethod, Type.DefaultBinder, _comObj, args);
}

我是这样称呼它的:

string[] result = (string[])ExplorerCore.ComInvoke("CopyFiles", new object[]{"arg1_1", "arg1_2"}, "arg2");

我总是得到 COMException: HRESULT: 0x80020008 (DISP_E_BADVARTYPE))。

这里是C++的获取方法:

STDMETHODIMP CopyFiles(BSTR ** src, BSTR dest, BSTR ** result);

以及.IDL文件接口声明:

HRESULT CopyFiles([in, string] BSTR ** src, [in, string] BSTR dest, [out, retval] BSTR ** test);

编辑 1: 这是正确的代码(没有数组):

C#:

string[] result = (string[])ExplorerCore.ComInvoke("CopyFiles", "arg1", "arg2");

C++

STDMETHODIMP CopyFiles(BSTR src, BSTR dest, BSTR* result);

IDL:

HRESULT CopyFiles([in, string] BSTR src, [in, string] BSTR dest, [out, retval] BSTR* test);

谢谢。 安德鲁

【问题讨论】:

  • 问题有点不清楚。在第二个代码块中,您传入了两个参数——一个object[](包含两个strings)和一个string。你说这行得通。该块后面的注释是否意味着如果将第一个参数更改为string[],它会失败?
  • 对不起,这不起作用。我的意思是它一直有效,直到我开始尝试传递字符串数组并且没有用“**”更改 C++ 方法。
  • 所以当你通过时它可以工作(object[]string),但在你通过时不起作用(string[]string)?
  • 当我通过(stringstring)并且我坚持试图通过(string[]string)时,它起作用了。要传递一个数组,我添加了“**”,但类型不匹配......对不起我的英语,我知道可能很难理解我想说什么
  • 请用清晰的例子更新您的问题,说明哪些有效,哪些无效。根据您的帖子,它在您通过 (object[], string) 时有效(这就是您的第二个代码块所做的)。你的帖子没有说任何关于通过的内容(stringstring)。

标签: arrays string com client-server idl


【解决方案1】:

OP 和我在一次私下讨论中设法让他为他工作。这很可能是代理/存根支持什么类型的问题。我不知道所有细节,但我知道 COM 附带的一些开箱即用的代理/存根对数组的支持有限。

此外,根据我的经验,在处理互操作方案时,几乎总是最好遵循定义为 here 的 OLE 自动化接口规则。如那里所示,唯一受支持的数组类型是SAFEARRAY。这对于自动化来说是有意义的,因为SAFEARRAYs 是唯一具有足够元数据来描述它们自己的内容和数组形状的标准数组类型。

不幸的是,这个文档要么是关于SAFEARRAYs 的错误,要么是信息不足。我曾经在 COM 和 .NET 或 COM 和 VBA 之间无缝工作的唯一数组类型是SAFEARRAY(VARIANT)。此外,我只是通过引用传递它来完成这项工作 (SAFEARRAY(VARIANT)*)。

说了这么多,这就是对 OP 有效的方法:

IDL:

HRESULT CopyFiles([in] SAFEARRAY(VARIANT)* src, [in] BSTR dest, [out, retval] SAFEARRAY(VARIANT)** test);

C++:

STDMETHODIMP CopyFiles(LPSAFEARRAY src, BSTR dest, LPSAFEARRAY* result)

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 2012-04-28
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多