【发布时间】: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)? -
当我通过(
string,string)并且我坚持试图通过(string[],string)时,它起作用了。要传递一个数组,我添加了“**”,但类型不匹配......对不起我的英语,我知道可能很难理解我想说什么 -
请用清晰的例子更新您的问题,说明哪些有效,哪些无效。根据您的帖子,它在您通过 (
object[],string) 时有效(这就是您的第二个代码块所做的)。你的帖子没有说任何关于通过的内容(string,string)。
标签: arrays string com client-server idl