5

我用 C# 编写了 COM 类,以及一个这样的函数:

public void SignAttached(
        byte[] message,
        ref byte[] signedMessage, 
        string userName = "USER"
        )

}

当我尝试从 C++ 代码调用此函数时,我有异常:-“已将等级 12536 的 SafeArray 传递给期望等级为 1.Unknown error 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);

和编译器在 *.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);

有人可以帮忙吗?

4

1 回答 1

1

您的 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

编辑:我只是尝试使用该工具,但它似乎并不像我记得的那样好用。无论如何,我很确定您的类型库不会使用 SAFEARRAYs。

于 2013-12-11T14:07:48.847 回答