我在C#中编写了COM类,其中一个函数是这样的:
public void SignAttached(
byte[] message,
ref byte[] signedMessage,
string userName = "USER"
)
}
当我尝试从C ++代码调用此函数时,我有一个例外: - “等级为12536的SafeArray已传递给期望排名为1.Unknown错误0x80131538的数组的方法”,并且每次更改第一个等级,C ++代码:
SAFEARRAY*message = SafeArrayCreateVector(VT_UI1, 0, 1);
SAFEARRAY*signedMessage = SafeArrayCreateVector(VT_UI1, 0, 1);
_bstr_t userName = "USER";
pInstanse ->SignAttached(message,&signedMessage,userName);
和compilator在* .tlh文件中为函数创建包装器:
HRESULT SignAttached (
SAFEARRAY * message,
SAFEARRAY * * signedMessage,
_bstr_t userName );
如果要查看带有帮助oleviewer(IDL语言)的* .tlb文件,导出功能是:
HRESULT SignAttached(
[in] SAFEARRAY(unsigned char) message,
[in, out] SAFEARRAY(unsigned char)* signedMessage,
[in, optional, defaultvalue("USER")] BSTR userName);
任何人都可以帮忙吗?
答案 0 :(得分:1)
您的C#数组参数未作为SAFEARRAYs向COM公开。 看看你是否可以使用tlbexp检查C#代码的类型库,然后使用一些工具来查看类型库,但我猜你会看到类似
的内容 [in] unsigned char *
和
[in,out] unsigned char *
表示您的前两个参数。
我刚在我的机器上找到了oleview.exe(我以为它不再分发了)。在使用tlbexp导出后,您可以使用它来检查您的类型库。我认为如果您还没有安装Windows SDK,则需要安装它。对我来说,oleview.exe在......
C:\Program Files (x86)\Windows Kits\8.0\bin\x86
编辑:我只是尝试使用该工具,它似乎没有像我记得的那样好用。无论如何,我很确定你的typelib不会使用SAFEARRAY。