[英]c# FindFirstDevice Marshaling
我有在WinCE 6.0版本上运行的ac#应用程序。 我需要在运行时卸载/重新加载SD卡驱动程序。 我试图通过调用FindFirstDevice,然后通过DeactivateDevice / ActivateDeviceEX调用来做到这一点。 我的问题是FindFirstDevice()调用始终失败。 我认为这与我将第二个参数编组给它的方式有关。 谁能告诉我我在做什么错? 这是代码:
[DllImport("coredll.dll", SetLastError = true)]
public static extern int FindFirstDevice(DeviceSearchType
searchType, IntPtr searchParam, ref DEVMGR_DEVICE_INFORMATION pdi);
public bool MountSDCardDrive(string mRegPath)
{
const int INVALID_HANDLE_VALUE = -1;
int handle = INVALID_HANDLE_VALUE;
DeviceSearchType searchType = DeviceSearchType.DeviceSearchByDeviceName;
DEVMGR_DEVICE_INFORMATION di = new DEVMGR_DEVICE_INFORMATION();
di.dwSize = (uint)Marshal.SizeOf(typeof(DEVMGR_DEVICE_INFORMATION));
string searchParamString = "*";
IntPtr searchParam = Marshal.AllocHGlobal(searchParamString.Length);
Marshal.StructureToPtr(searchParamString, searchParam, false);
handle = FindFirstDevice(searchType, searchParam, ref di);
if (handle == INVALID_HANDLE_VALUE)
{
// Failure - print error
int hFindFirstDeviceError = Marshal.GetLastWin32Error();
using (StreamWriter bw = new StreamWriter(File.Open(App.chipDebugFile, FileMode.Append)))
{
String iua = "DevDriverInterface: error from FindFirstDevice: " + hFindFirstDeviceError.ToString();
bw.WriteLine(iua);
}
return false;
}
... (rest of code)
如果我更改行Marshal.StructureToPtr(searchParamString, searchParam, false);
到searchParam = Marshal.StringToBSTR(searchParamString);
“我最终遇到错误1168(ERROR_NOT_FOUND),而不是18(没有更多文件)。
请注意,我的目的是在工作时使用“ SDH1”的searchParamString
。 我目前正在使用“ *”的searchParamString
来查看返回的内容并排除特定的字符串值。
感谢您提供的任何帮助-Lynn
必须将FindFirstDevice与FindNextDevice一起使用(它使用FindFirstDevice返回的句柄作为其第一个参数,如果找到了另一个设备,则返回TRUE),因为您必须迭代所有设备才能找到合适的设备。您必须在结构中比较szLegacyName值。
去掉:
IntPtr searchParam = Marshal.AllocHGlobal(searchParamString.Length);
并仅使用:
IntPtr searchParam = Marshal.StringToBSTR(searchParamString);
由于该方法已经提供了分配必要内存的功能(请记住,在finally块中使用Marshal.FreeBSTR()释放之后的内存空间)。
您的结构应如下所示:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEVMGR_DEVICE_INFORMATION
{
public UInt32 dwSize;
public IntPtr hDevice;
public IntPtr hParentDevice;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public String szLegacyName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public String szDeviceKey;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public String szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public String szBusName;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.