首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DllImport和char*

DllImport和char*
EN

Stack Overflow用户
提问于 2010-04-03 02:35:22
回答 4查看 11.1K关注 0票数 8

我有一个要从DLL导入的方法,它的签名是:

代码语言:javascript
复制
BOOL GetDriveLetter(OUT char* DriveLetter)

我试过了

代码语言:javascript
复制
    [DllImport("mydll.dll")]
    public static extern bool GetDriveLetter(byte[] DriveLetter);

代码语言:javascript
复制
    [DllImport("mydll.dll")]
    public static extern bool GetDriveLetter(StringBuilder DriveLetter);

但这两个函数都没有在DriveLetter变量中返回任何内容。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-03 02:41:31

看起来函数GetDriveLetter需要一个指向足够的内存来容纳驱动器号的char*

我认为解决这个问题的最简单的方法是传递一个原始的IntPtr,并将对GetDriveLetter的调用封装在一个负责资源管理和向string转换的API中。

代码语言:javascript
复制
[return:MarshalAsAttribute(UnmanagedType.Bool)]
private static extern bool GetDriveLetter(IntPtr ptr);

public static bool GetDriveLetter(out string drive) {
  drive = null;
  var ptr = Marshal.AllocHGlobal(10);
  try {
    var ret = GetDriveLetter(ptr);
    if ( ret ) {
      drive = Marshal.PtrToStringAnsi(ptr);
    }
    return ret;
  } finally { 
    Marshal.FreeHGlobal(ptr);
  }
}
票数 8
EN

Stack Overflow用户

发布于 2010-04-03 02:56:53

StringBuilder可能是可行的方法,但是在调用函数之前必须设置字符串构建器的容量。因为C#不知道GetDriveLeter将使用多少内存,所以您必须确保StringBuilder有足够的空间。然后,编组程序会将分配给该长度的char*传递给函数,并将其编组回StringBuilder。

代码语言:javascript
复制
[return:MarshalAsAttribute(UnmanagedType.I4)]
private static extern bool GetDriveLetter(StringBuilder DriveLetter);

public static bool GetDriveLetter(out string driverLetter) {
  StringBuilder buffer = new StringBuilder(10);
  bool ret = GetDriveLetter(buffer);
  driveLetter = buffer.ToString();
  return ret;
}

有关示例,请参阅p/invoke sample for GetWindowText()

票数 0
EN

Stack Overflow用户

发布于 2013-03-09 00:15:36

代码语言:javascript
复制
[DllImport("mydll.dll")]
public static extern bool GetDriveLetter([MarshalAs(UnmanagedType.LPStr)]  string DriveLetter)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2568436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档