我有一个要从DLL导入的方法,它的签名是:
BOOL GetDriveLetter(OUT char* DriveLetter)我试过了
[DllImport("mydll.dll")]
public static extern bool GetDriveLetter(byte[] DriveLetter);和
[DllImport("mydll.dll")]
public static extern bool GetDriveLetter(StringBuilder DriveLetter);但这两个函数都没有在DriveLetter变量中返回任何内容。
发布于 2010-04-03 02:41:31
看起来函数GetDriveLetter需要一个指向足够的内存来容纳驱动器号的char*。
我认为解决这个问题的最简单的方法是传递一个原始的IntPtr,并将对GetDriveLetter的调用封装在一个负责资源管理和向string转换的API中。
[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);
}
}发布于 2010-04-03 02:56:53
StringBuilder可能是可行的方法,但是在调用函数之前必须设置字符串构建器的容量。因为C#不知道GetDriveLeter将使用多少内存,所以您必须确保StringBuilder有足够的空间。然后,编组程序会将分配给该长度的char*传递给函数,并将其编组回StringBuilder。
[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()。
发布于 2013-03-09 00:15:36
[DllImport("mydll.dll")]
public static extern bool GetDriveLetter([MarshalAs(UnmanagedType.LPStr)] string DriveLetter)https://stackoverflow.com/questions/2568436
复制相似问题