C#访问驱动程序中,关于设备枚举的问题,请高手指教?
在设备枚举的过程中,需要调用SetupDiEnumDeviceInterfaces()
和SetupDiGetClassDevs()两个WIN32的API函数,但在这两个
函数的参数中,有相当于VC++中的GUID类型的硬件标识符变量,
我定义结构如下:
[StructLayout(LayoutKind.Sequential)]
public struct GUID
{
public long Data1;
public short Data2;
public short Data3;
public byte[] Data4;
}
在应用过程中,
m_Guid=new GUID();
m_Guid.Data1=0x77f49320;
m_Guid.Data2=0x16ef;
m_Guid.Data3=0x11d2;
m_Guid.Data4=new byte[8]
{0xad,0x51,0x00,0x60,0x97,0xb5,0x14,0xdd};
数据传送正确,但在程序调用以上两函数时,系统提示“无法封送
类型GUID的字段Data4:该类型无法作为结构字段进行封送处理”。
请问数组类型的Data4如何初始化,或该结构如何定义,谢谢指教。
问题点数:0、回复次数:7Top
1 楼rqxiang(翔子)回复于 2003-04-01 23:23:44 得分 0
gzTop
2 楼saucer(思归)回复于 2003-04-01 23:45:19 得分 0
have you tried to use System.Guid structure instead?Top
3 楼Knight94(愚翁)回复于 2003-04-02 08:57:38 得分 0
.net直接有GUID类型Top
4 楼lh29(冷雪)回复于 2003-04-03 09:31:42 得分 0
谢谢楼上的各位朋友,我现在已经可以传递GUID了,不过设备枚举一直不成功,不知道哪位有经验的兄弟指点一二。高分相送。Top
5 楼Knight94(愚翁)回复于 2003-04-04 17:07:51 得分 0
给大家看看你的代码Top
6 楼lh29(冷雪)回复于 2003-04-04 18:22:04 得分 0
//定义常量
private System.Guid m_Guid=new Guid(0x77f49320,0x16ef,0x11d2,0xad,0x51,0x00,0x60,0x97,0xb5,0x14,0xdd);
const uint DIGCF_PRESENT = 0x00000002;
const uint DIGCF_INTERFACEDEVICE = 0x00000010;
const int ERROR_NO_MORE_ITEMS =259;
private const int INVALID_HANDLE_VALUE=-1;
private const int NULL=0;
//定义参数结构
[StructLayout(LayoutKind.Sequential)]
public struct SP_DEVICE_INTERFACE_DATA
{
public ulong cbSize;
public System.Guid InterfaceClassGuid;
public ulong Flags;
public ulong Reserved;
}
//定义导入Dll的函数
[DllImport("setupapi.DLL", SetLastError=true)]
public static extern unsafe int SetupDiGetClassDevs(ref System.Guid ClassGuid,
int Enumerator,//ref string Enumerator,
long hwndParent, //HWND
long Flags );
[DllImport("setupapi.DLL", SetLastError=true)]
public static extern unsafe long SetupDiEnumDeviceInterfaces(
int DeviceInfoSet,
int DeviceInfoData,
ref System.Guid interfaceClassGuid,
ulong MemberIndex,
ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);
//程序的调用API函数部分程序
.............
hardwareDeviceInfo = SetupDiGetClassDevs (
ref pGuid,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_INTERFACEDEVICE)); // Function class devices.
deviceInfoData=new SP_DEVICE_INTERFACE_DATA();
deviceInfoData.cbSize=(ulong)Marshal.SizeOf(deviceInfoData);
while (!done)
{
*UsbDevices=new USB_DEVICE_DESCRIPTOR();
for (; i < NumberDevices; i++)
{
long count=SetupDiEnumDeviceInterfaces( hardwareDeviceInfo,
0,
ref pGuid,
i,
ref deviceInfoData);
..................
}
...................
请问编程过程中有哪些需要特别注意的问题?谢谢各位!Top
7 楼lh29(冷雪)回复于 2003-04-04 18:25:28 得分 0
另外,上面代码中hardwareDeviceInfo应定义成什么类型的变量。我认为可能跟程序的正确性有关,我现在定义成int.Top




