当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?
Posted
技术标签:
【中文标题】当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?【英文标题】:When I use regasm, all parameters are typed as inputs? Can that be changed? 【发布时间】:2014-09-09 21:57:12 【问题描述】:我正在使用 C++ 应用程序来调用 c sharp dll。 Regasm 将我的函数从具有两个字符数组并将一个 int 返回到一个具有两个 BSTR 和一个长指针作为参数的函数中。两个 BSTR 被标记为输入,长指针是我的原始返回值。问题是我的一个字符数组是一个真正的输入,另一个是从 dll 返回的错误信息。是否有标识符让 regasm 知道我的第二个字符串参数实际上是一个输出?在调试时,我验证了 dll 中的第二个参数正在更改,但没有返回到调用函数。
【问题讨论】:
【参考方案1】:这确实是 .NET 方法到 COM 方法的正常转换。 BSTR 是标准的字符串互操作类型,它提供了非常强大的保证,即字符串可以跨模块/语言边界正确编组,而不会出现重大的内存管理问题。一个普通的字符串变成了一个 BSTR,一个 ref/out 字符串变成了一个 BSTR*,它允许你传回一个新的字符串。与返回类型大致相同,COM 方法必须返回 HRESULT 以指示成功/失败,因此原始返回值必然成为 C# 中的 out 参数。
你会非常不明智地修补这个,有很多方法可以把你的腿炸掉。您可以通过应用 [MarshalAs] 属性来强制使用不同的参数类型。 [PreserveSig] 抑制返回值转换。执行此操作时,函数调用不能再跨公寓边界编组。同样,非常要小心,尤其是当你想返回字符串时。这是一个有保证的内存管理问题。在 C++ 中处理 BSTR 或返回值不是问题,您可以谷歌大量示例代码。
【讨论】:
以上是关于当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我输入整数时它显示为不是整数? (Python)[重复]
matlab 2014a调用所有自定义函数时,都出现”未定义与 'double' 类型的输入参数相对应的函数 “,怎么做
关于COM .net程序集,regasm,dll,tlb和guids的几个简短问题