5 c# c++ com serialization safearray
我用C#编写了COM类,并提供了一个这样的函数:
public void SignAttached(
byte[] message,
ref byte[] signedMessage,
string userName = "USER"
)
Run Code Online (Sandbox Code Playgroud)
}
当我尝试从C ++代码调用此函数时,我得到了很多启发:-“等级12536的SafeArray已传递给期望等级1数组的方法,未知错误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);
Run Code Online (Sandbox Code Playgroud)
和编译器在* .tlh文件中为函数创建包装器:
HRESULT SignAttached (
SAFEARRAY * message,
SAFEARRAY * * signedMessage,
_bstr_t userName );
Run Code Online (Sandbox Code Playgroud)
并查看带有帮助oleviewer(IDL语言)导出功能的* .tlb文件是:
HRESULT SignAttached(
[in] SAFEARRAY(unsigned char) message,
[in, out] SAFEARRAY(unsigned char)* signedMessage,
[in, optional, defaultvalue("USER")] BSTR userName);
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
您的 C# 数组参数不会作为 SAFEARRAY 公开给 COM。看看是否可以使用 tlbexp 检查 C# 代码的类型库,然后使用某种工具查看类型库,但我猜测您会看到类似的内容
[in] unsigned char *
和
[in,out] unsigned char *
对于你的前2个参数。
我刚刚在我的机器上找到了 oleview.exe(我以为它不再分发了)。在使用 tlbexp 导出后,您可以使用它来检查您的类型库。我认为如果您还没有安装 Windows SDK,则需要安装它。对我来说,oleview.exe 位于...
C:\Program Files (x86)\Windows Kits\8.0\bin\x86
编辑:我只是尝试使用该工具,但它似乎并不像我记得的那样好用。不管怎样,我很确定你的类型库不会使用 SAFEARRAY。