首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++客户端调用C# COM-server函数

从C++客户端调用C# COM-server函数
EN

Stack Overflow用户
提问于 2017-07-14 18:41:49
回答 1查看 406关注 0票数 1

在C++上寻找com服务器的帮助。

下面是调用方法的C#客户端代码:

代码语言:javascript
复制
public static object ComInvoke(string method, params object[] args)
{
    return _comObj.GetType().InvokeMember(method, BindingFlags.InvokeMethod, Type.DefaultBinder, _comObj, args);
}

我就是这么叫它的:

代码语言:javascript
复制
string[] result = (string[])ExplorerCore.ComInvoke("CopyFiles", new object[]{"arg1_1", "arg1_2"}, "arg2");

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

下面是C++获取方法:

代码语言:javascript
复制
STDMETHODIMP CopyFiles(BSTR ** src, BSTR dest, BSTR ** result);

和.IDL文件接口声明:

代码语言:javascript
复制
HRESULT CopyFiles([in, string] BSTR ** src, [in, string] BSTR dest, [out, retval] BSTR ** test);

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

C#:

代码语言:javascript
复制
string[] result = (string[])ExplorerCore.ComInvoke("CopyFiles", "arg1", "arg2");

C++

代码语言:javascript
复制
STDMETHODIMP CopyFiles(BSTR src, BSTR dest, BSTR* result);

IDL:

代码语言:javascript
复制
HRESULT CopyFiles([in, string] BSTR src, [in, string] BSTR dest, [out, retval] BSTR* test);

谢谢。安德鲁

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 20:57:00

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

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

不幸的是,这个文档要么是SAFEARRAY的错误文档,要么是信息不够丰富的文档。我唯一能够在COM & .NET或COM & VBA之间无缝工作的数组类型是SAFEARRAY(VARIANT)。而且,我只有通过引用(SAFEARRAY(VARIANT)*)来传递它才能完成这个工作。

所有这些,下面是OP的工作原理:

IDL:

代码语言:javascript
复制
HRESULT CopyFiles([in] SAFEARRAY(VARIANT)* src, [in] BSTR dest, [out, retval] SAFEARRAY(VARIANT)** test);

C++:

代码语言:javascript
复制
STDMETHODIMP CopyFiles(LPSAFEARRAY src, BSTR dest, LPSAFEARRAY* result)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45109727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档