当我使用regasm时,所有参数都被键入为输入?这可以改变吗

本文关键字:输入 改变 regasm 参数 | 更新日期: 2023-09-27 18:21:12

我正在使用C++应用程序来调用一个C sharp dll。Regism将我的函数从两个字符数组和返回一个int变成了一个以两个BSTR和一个长指针为参数的函数。这两个BSTR被标记为输入,长指针是我最初的返回值。问题是,我的一个字符数组是真正的输入,另一个是从dll返回的错误信息。有没有一个标识符可以让regasm知道我的第二个字符串参数实际上是一个输出?在调试时,我验证了dll中的第二个参数正在更改,但没有返回到调用函数。

当我使用regasm时,所有参数都被键入为输入?这可以改变吗

这确实是.NET方法到COM方法的正常转换。BSTR是标准的字符串互操作类型,它提供了非常强大的保证,可以跨模块/语言边界正确地封送字符串,而不会出现严重的内存管理问题。一个普通字符串变成BSTR,一个ref/out字符串变成BSTR*,允许您将一个新字符串传回来。与返回类型非常相似,COM方法必须返回HRESULT以指示成功/失败,因此原始返回值必然成为C#语言中的out参数。

你会非常不明智地修补这个,有很多方法可以让你大吃一惊。你可以通过应用[MarshalAs]属性来强制使用不同的参数类型。[PreserveSig]以抑制返回值转换。执行此操作时,无法再跨单元边界封送函数调用。同样,要非常小心,尤其是当您想要返回字符串时。这是一个内存管理问题。处理C++中的BSTR或返回值是而不是问题,您可以在谷歌上搜索大量示例代码。