2013-12-11 44 views
3

我写的COM类在C#中,和一个函数调用托管代码是这样的:需要从托管C++代码

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

}

当我尝试从C调用此函数++代码,我exeption : - “秩12536的安全数组已被传递给需要秩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创建包装我N *的功能.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); 

任何人可以帮助?

+1

您确定这是您测试的确切代码吗?这对我来说很好。你能发布一个我们可以看看的repro项目吗? –

+1

真的!!!!请 - 发送给我的项目,这是如此的帮助我! – Alex

+0

我已经在这里上传了一个:https://dl.dropboxusercontent.com/u/42400504/MyClassLibrary.zip –

回答

-1

让我直说吧。您正在使用对数组的引用? 这部分SAFEARRAY*signedMessage = SafeArrayCreateVector(VT_UI1, 0, 1);然后 pInstanse ->SignAttached(message,&signedMessage,userName); 转换为 int foo [] = {16,2,77,40,12071}; 然后 pInstanse ->SignAttached(message,&foo,userName); 我认为这甚至是不可能的。 (参考指针?) 我会解决像这样 pInstanse ->SignAttached(message,*foo,userName); 本质int foo[];相当于int* foo;

+0

通常不使用引用数组 - compilator VS2012在* .tlh文件中创建包装,其中第一个参数SAFEARRAY *和第二 - SAFEARRAY **。我只是使用它 - 并且无法正确发送参数...和我使用的数组是字节富[](二进制数据 - 里面可以是任何东西) - 可能是这个问题明确我的问题 – Alex

1

你的C#数组参数不被暴露于COM作为SAFEARRAYS。 看看你能不能用tlbexp,然后使用一些工具来查看类型库检查你的C#代码的类型库,但我的猜测是,你会看到类似

[in] unsigned char *

[in,out] unsigned char *

为您的第2个参数。

我刚刚在我的机器上发现了oleview.exe(我以为它不再分配)。用tlbexp导出后,您可以使用它来检查您的typelib。我想如果你还没有安装Windows SDK,你需要安装它。对我来说,OLEView.exe这类是...

C:\Program Files (x86)\Windows Kits\8.0\bin\x86

编辑:我只是想使用的工具,它似乎并没有工作几乎和我记住了。无论如何,我很确定你的typelib不会使用SAFEARRAYs。

+0

感谢oleview.exe!我使用SAFEARRAY,因为编译器VS2012在* .tlh文件中创建了第一个参数SAFEARRAY *和第二个SAFEARRAY **的包装。 – Alex

+0

我将tlb的内容添加到问题中... – Alex