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

时间:2014-09-09 21:57:13

标签: c# c++ com interop regasm

我正在使用C ++应用程序调用c sharp dll。 Regasm将我的函数从拥有两个字符数组并将一个int返回到一个带有两个BSTR和一个长指针作为参数的函数中。两个BSTR标记为输入,长指针是我的原始返回值。问题是我的一个字符数组是一个真正的输入,另一个是从dll返回的错误信息。是否有一个标识符让regasm知道我的第二个字符串参数实际上是一个输出?在调试时,我确认第二个参数在dll中被更改但没有返回到调用函数。

1 个答案:

答案 0 :(得分:2)

这确实是.NET方法到COM方法的正常转换。 BSTR是标准的字符串互操作类型,它非常有力地保证字符串可以在模块/语言边界上正确编组,而不会出现主要的内存管理问题。普通字符串变成BSTR,ref / out字符串变成BSTR *,允许您传回新字符串。返回类型大致相同,COM方法必须返回HRESULT来指示成功/失败,因此原始返回值必然会成为C#speak中的 out 参数。

非常不明智地修补这个,有很多方法可以让你的腿脱落。您可以通过应用[MarshalAs]属性来强制使用不同的参数类型。 [PreserveSig]来抑制返回值转换。执行此操作时,函数调用不能再跨越公寓边界进行封送。再次,非常小心这一点,特别是当你想要返回字符串时。这是一个有保障的内存管理问题。处理BSTR或在C ++中返回值是一个问题,你可以搜索大量示例代码。