【问题标题】:Returning strings from Windows C functions从 Windows C 函数返回字符串
【发布时间】:2011-05-29 04:13:42
【问题描述】:

我是 C 和 C++ 中纯 Windows API 级函数的完全新手,最近一直在试验 .NET 互操作性。我已经构建了一个简单的库,它成功地将数值(int/float 等)返回给 .NET 调用者,但我对字符串没有那么幸运。

我尝试了多种不同的数据类型,但似乎都没有效果:LPSTR、LPCSTR、LPCTSTR 和 LPCWSTR。诚然,我没有尝试过 char*。此外,一旦将方法设置为返回字符串,是否需要 .NET 将其编组为特定的数据类型,或者是否可以简单地将其直接读入 System.String 对象?我尝试解析成 IntPtr 然后转换成字符串,但没有奏效。

【问题讨论】:

  • 仅供参考,LPSTRchar * 是同一类型。如果您查看 Windows SDK 标头,您会发现 typedef char * LPSTR;
  • .NET 在 UTF-16 中工作。最好使用wchar_t*,避免不必要的字符编码转换。

标签: .net c winapi interop pinvoke


【解决方案1】:

执行 Windows API 的工作。它通常不返回指针,它会填充您传入的缓冲区。

托管代码:

[DllImport("YourLibrary", CharSet = CharSet.Auto)] 
static extern Int32  SomeArbitraryFunction (
    String        input,          // string passed to API (LPCSTR) 
    StringBuilder output,         // output filled by API (LPSTR)    
    Int32         outputMaxLen    // StringBuilder.Capacity
); 

在 C/C++ 方面:

DWORD WINAPI SomeArbitraryFunction (
    LPCSTR input,
    LPSTR output,
    DWORD outputMaxLen
);

【讨论】:

  • 很好的建议。我建议您还提供与此 p/invoke 声明匹配的 C 代码示例。
  • 我已经尝试过了,但我仍然没有收到任何文本。我将如何用文本填充 LPSTR?另外,我如何将两段文字连接在一起?
  • 你能在另一个方向传递数据吗? (如果你有 LPCSTR,它会从托管代码中接收一些东西吗?)要填充 LPSTR 指向的缓冲区,你使用 strcpy 变体......最好是 _strncpy_s。
  • 好的 - 成功了!我的问题是填充 StringBuilder 对象,我现在已经实现了!
猜你喜欢
  • 2014-11-06
  • 2013-03-25
  • 1970-01-01
  • 2021-05-12
  • 2023-03-17
  • 2011-04-14
相关资源
最近更新 更多