【问题标题】:need to call managed code from unmanaged c++ code需要从非托管 c++ 代码调用托管代码
【发布时间】:2013-12-29 04:03:31
【问题描述】:

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

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

}

当我尝试从 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);

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

有人可以帮忙吗?

【问题讨论】:

  • 您确定这是您正在测试的确切代码吗?这对我来说很好。你能发布一个我们可以看看的重现项目吗?
  • 真的!!!!请 - 把项目发给我,这对我很有帮助!!!

标签: c# c++ serialization com safearray


【解决方案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

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

【讨论】:

  • 感谢 oleview.exe !我使用 SAFEARRAY 因为编译器 VS2012 在 *.tlh 文件中创建包装器,其中第一个参数 SAFEARRAY * 和第二个参数 - SAFEARRAY **。
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多