【问题标题】:P/Invoke BSTR from unmanaged code从非托管代码 P/Invoke BSTR
【发布时间】:2011-05-23 01:40:10
【问题描述】:

非托管函数的 VB 签名应该是什么 void PopulateBSTR(BSTR outstring)?

函数 PopulateBSTR 执行 SysAllocString 并填充字符串。请注意,未管理的签名具有参数 BSTR 而不是 BSTR*。当 C++ 签名以 BSTR* 作为参数时,我可以使用 IntPtr 签名来编组 BSTR 字符串。

(非托管代码是我无法修改但需要使用的外部 dll。)

【问题讨论】:

  • 不存在通过传递的 BSTR 参数(而不是 BSTR*)返回字符串有效的情况。尽管完全不清楚那架飞机是如何在没有变成火球的情况下降落的,但这段遗留代码只能在偶然情况下起作用。你没有那种运气了。
  • @Hans 是完全正确的。你需要回归基础,弄清楚到底发生了什么。

标签: .net vb.net pinvoke


【解决方案1】:

PInvoke.net,好像需要用MarshallAs Attribute来表示应该当作BSTR处理。

【讨论】:

    【解决方案2】:

    需要在dllimport的属性列表中指定CharSet = CharSet.Unicode。将其捕获为 StringBuilder 而不是字符串类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2013-08-24
      • 1970-01-01
      • 2012-03-04
      • 2010-09-18
      相关资源
      最近更新 更多