在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);谢谢。安德鲁
发布于 2017-07-14 20:57:00
我和OP在一次私下的讨论中设法让这件事为他工作。这很可能是代理/存根支持什么类型的问题。我不知道所有细节,但我确实知道,COM附带的一些开箱即用的代理/存根对数组的支持有限。
此外,在我的经验中,在处理互操作场景时,几乎总是最好遵循OLE自动化接口的规则,如定义的这里。如前所述,唯一支持的数组类型是SAFEARRAY。这对于自动化是有意义的,因为SAFEARRAY是唯一有足够元数据来描述自己的内容和数组形状的标准数组类型。
不幸的是,这个文档要么是SAFEARRAY的错误文档,要么是信息不够丰富的文档。我唯一能够在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)https://stackoverflow.com/questions/45109727
复制相似问题