gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:01:26 24 4
gpt4 key购买 nike

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

最佳答案

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

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

关于c# - 当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25754189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com