先取设备类型:    /// <summary>
    /// 设备类型
    /// </summary>
    class DeviceClasses
    {
        public static Guid ClassesGuid;
        public const int MAX_SIZE_DEVICE_DESCRIPTION = 1000;
        public const int CR_SUCCESS = 0x00000000;
        public const int CR_NO_SUCH_VALUE = 0x00000025;
        public const int CR_INVALID_DATA = 0x0000001F;
        private const int DIGCF_PRESENT = 0x00000002;
        private const int DIOCR_INSTALLER = 0x00000001;
        private const int MAXIMUM_ALLOWED = 0x02000000;
        public const int DMI_MASK = 0x00000001;
        public const int DMI_BKCOLOR = 0x00000002;
        public const int DMI_USERECT = 0x00000004;        [StructLayout(LayoutKind.Sequential)]
        class SP_DEVINFO_DATA
        {
            public int cbSize;
            public Guid ClassGuid;
            public int DevInst;
            public ulong Reserved;
        }        [DllImport("cfgmgr32.dll")]
        private static extern UInt32 CM_Enumerate_Classes(UInt32 ClassIndex, ref Guid ClassGuid, UInt32 Params);        [DllImport("setupapi.dll")]
        private static extern Boolean SetupDiClassNameFromGuidA(ref Guid ClassGuid, StringBuilder ClassName, UInt32 ClassNameSize, ref UInt32 RequiredSize);        [DllImport("setupapi.dll")]
        private static extern IntPtr SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator, IntPtr hwndParent, UInt32 Flags);        [DllImport("setupapi.dll")]
        private static extern Boolean SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);        [DllImport("setupapi.dll")]
        private static extern IntPtr SetupDiOpenClassRegKeyExA(ref Guid ClassGuid, UInt32 samDesired, int Flags, IntPtr MachineName, UInt32 Reserved);        [DllImport("setupapi.dll")]
        private static extern Boolean SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex, SP_DEVINFO_DATA DeviceInfoData);        [DllImport("advapi32.dll")]
        private static extern UInt32 RegQueryValueA(IntPtr KeyClass, UInt32 SubKey, StringBuilder ClassDescription, ref UInt32 sizeB);        /// <summary>
        /// 设备类型图标信息
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public class SP_CLASSIMAGELIST_DATA
        {
            public int cbSize;
            public ImageList ImageList;
            public ulong Reserved;
        }
        public struct RECT
        {
            long left;
            long top;
            long right;
            long bottom;
        }        /// <summary>
        /// 载入图片
        /// </summary>
        /// <param name="hInstance"></param>
        /// <param name="Reserved"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int LoadBitmapW(int hInstance, ulong Reserved);        /// <summary>
        /// 获取图标
        /// </summary>
        /// <param name="ClassImageListData"></param>
        /// <returns></returns>
        [DllImport("setupapi.dll")]
        public static extern Boolean SetupDiGetClassImageList(out SP_CLASSIMAGELIST_DATA ClassImageListData);
        [DllImport("setupapi.dll")]
        public static extern int SetupDiDrawMiniIcon(Graphics hdc, RECT rc, int MiniIconIndex, int Flags);
        [DllImport("setupapi.dll")]
        public static extern bool SetupDiGetClassBitmapIndex(Guid ClassGuid, out int MiniIconIndex);
        [DllImport("setupapi.dll")]
        public static extern int SetupDiLoadClassIcon(ref Guid classGuid, out IntPtr hIcon, out int index);        /// <summary>
        /// 枚举设备类型
        /// </summary>
        /// <param name="ClassIndex"></param>
        /// <param name="ClassName"></param>
        /// <param name="ClassDescription"></param>
        /// <param name="DevicePresent"></param>
        /// <returns></returns>
        public static int EnumerateClasses(UInt32 ClassIndex, StringBuilder ClassName, StringBuilder ClassDescription, ref bool DevicePresent)
        {
            Guid ClassGuid = Guid.Empty;
            IntPtr NewDeviceInfoSet;
            UInt32 result;
            SP_DEVINFO_DATA DeviceInfoData = new SP_DEVINFO_DATA();
            bool resNam = false;
            UInt32 RequiredSize = 0;
            result = CM_Enumerate_Classes(ClassIndex, ref ClassGuid, 0);
            DevicePresent = false;
            SP_CLASSIMAGELIST_DATA imagelist = new SP_CLASSIMAGELIST_DATA();
            if (result != CR_SUCCESS)
            {
                return (int)result;
            }
            resNam = SetupDiClassNameFromGuidA(ref ClassGuid, ClassName, RequiredSize, ref RequiredSize);
            if (RequiredSize > 0)
            {
                ClassName.Capacity = (int)RequiredSize;
                resNam = SetupDiClassNameFromGuidA(ref ClassGuid, ClassName, RequiredSize, ref RequiredSize);
            }
            NewDeviceInfoSet = SetupDiGetClassDevsA(ref ClassGuid, 0, IntPtr.Zero, DIGCF_PRESENT);
            if (NewDeviceInfoSet.ToInt32() == -1)
            {
                DevicePresent = false;
                return 0;
            }            UInt32 numD = 0;
            DeviceInfoData.cbSize = 28;
            DeviceInfoData.DevInst = 0;
            DeviceInfoData.ClassGuid = System.Guid.Empty;
            DeviceInfoData.Reserved = 0;            Boolean res1 = SetupDiEnumDeviceInfo(
            NewDeviceInfoSet,
            numD,
            DeviceInfoData);            if (!res1)
            {
                DevicePresent = false;
                return 0;
            }
            SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
            IntPtr KeyClass = SetupDiOpenClassRegKeyExA(
                ref ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER, IntPtr.Zero, 0);
            if (KeyClass.ToInt32() == -1)
            {
                DevicePresent = false;
                return 0;
            }
            UInt32 sizeB = MAX_SIZE_DEVICE_DESCRIPTION;
            ClassDescription.Capacity = MAX_SIZE_DEVICE_DESCRIPTION;
            UInt32 res = RegQueryValueA(KeyClass, 0, ClassDescription, ref sizeB);
            if (res != 0) ClassDescription = new StringBuilder(""); //No device description
            DevicePresent = true;
            ClassesGuid = DeviceInfoData.ClassGuid;
            return 0;
        }
    }http://download.csdn.net/source/1871029

解决方案 »

  1.   

    再取设备信息:
        class DeviceInfo
        {
            private const int DIGCF_PRESENT = (0x00000002);
            private const int MAX_DEV_LEN = 1000;
            private const int SPDRP_FRIENDLYNAME = (0x0000000C);
            private const int SPDRP_DEVICEDESC = (0x00000000);        [StructLayout(LayoutKind.Sequential)]
            private class SP_DEVINFO_DATA
            {
                public int cbSize;
                public Guid ClassGuid;
                public int DevInst;
                public ulong Reserved;
            };
            [DllImport("setupapi.dll")]
            private static extern Boolean SetupDiClassGuidsFromNameA(string ClassN, ref Guid guids, UInt32 ClassNameSize, ref UInt32 ReqSize);        [DllImport("setupapi.dll")]
            private static extern IntPtr SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator, IntPtr hwndParent, UInt32 Flags);        [DllImport("setupapi.dll")]
            private static extern Boolean SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex, SP_DEVINFO_DATA DeviceInfoData);        [DllImport("setupapi.dll")]
            private static extern Boolean SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);        [DllImport("setupapi.dll")]
            private static extern Boolean SetupDiGetDeviceRegistryPropertyA(IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, UInt32 Property, UInt32 PropertyRegDataType, StringBuilder PropertyBuffer, UInt32 PropertyBufferSize, IntPtr RequiredSize);        /// <summary>
            /// 通过设备类型枚举设备信息
            /// </summary>
            /// <param name="DeviceIndex"></param>
            /// <param name="ClassName"></param>
            /// <param name="DeviceName"></param>
            /// <returns></returns>
            public static int EnumerateDevices(UInt32 DeviceIndex, string ClassName, StringBuilder DeviceName)
            {
                UInt32 RequiredSize = 0;
                Guid guid = Guid.Empty;
                Guid[] guids = new Guid[1];
                IntPtr NewDeviceInfoSet;
                SP_DEVINFO_DATA DeviceInfoData = new SP_DEVINFO_DATA();
                bool res = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize);
                if (RequiredSize == 0)
                {
                    //类型不正确
                    DeviceName = new StringBuilder("");
                    return -2;
                }            if (!res)
                {
                    guids = new Guid[RequiredSize];
                    res = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize);                if (!res || RequiredSize == 0)
                    {
                        //类型不正确
                        DeviceName = new StringBuilder("");
                        return -2;
                    }
                }            //通过类型获取设备信息
                NewDeviceInfoSet = SetupDiGetClassDevsA(ref guids[0], 0, IntPtr.Zero, DIGCF_PRESENT);
                if (NewDeviceInfoSet.ToInt32() == -1)
                {
                    //设备不可用
                    DeviceName = new StringBuilder("");
                    return -3;
                }            DeviceInfoData.cbSize = 28;
                //正常状态
                DeviceInfoData.DevInst = 0;
                DeviceInfoData.ClassGuid = System.Guid.Empty;
                DeviceInfoData.Reserved = 0;            res = SetupDiEnumDeviceInfo(NewDeviceInfoSet,
                       DeviceIndex, DeviceInfoData);
                if (!res)
                {
                    //没有设备
                    SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
                    DeviceName = new StringBuilder("");
                    return -1;
                }            DeviceName.Capacity = MAX_DEV_LEN;
                if (!SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, DeviceInfoData,
                SPDRP_FRIENDLYNAME, 0, DeviceName, MAX_DEV_LEN, IntPtr.Zero))
                {
                    res = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet,
                     DeviceInfoData, SPDRP_DEVICEDESC, 0, DeviceName, MAX_DEV_LEN, IntPtr.Zero);
                    if (!res)
                    {
                        //类型不正确
                        SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
                        DeviceName = new StringBuilder("");
                        return -4;
                    }
                }
                return 0;
            }
        }
      

  2.   

    查看设备资源:
        /// <summary>
        /// 设备资源(查询MSDN)
        /// </summary>
        public class DeviceResources
        {
            private const int DIGCF_PRESENT = (0x00000002);
            private const int MAX_DEV_LEN = 1000;
            private const int SPDRP_FRIENDLYNAME = (0x0000000C);  // FriendlyName (R/W)
            private const int SPDRP_DEVICEDESC = (0x00000000);    // DeviceDesc (R/W)        public const int sizIO_HEADER = 28;
            public const int sizDMA_HEADER = 16;
            public const int sizIRQ_HEADER = 20;
            public const int sizMEM_HEADER = 32;        public const int ResType_Mem = 0x00000001; //Physical address resource
            public const int ResType_IO = 0x00000002; //Physical I/O address resource
            public const int ResType_DMA = 0x00000003; //DMA channels resource
            public const int ResType_IRQ = 0x00000004; //IRQ resource        public const int CR_SUCCESS = 0;
            public const int CR_NO_MORE_LOG_CONF = 0x0000000E;
            public const int CR_BUFFER_SMALL = 0x0000001A;        public const int CR_NO_SUCH_VALUE = (0x00000025);
            public const int CR_INVALID_DATA = (0x0000001F);
            //--------------------------------------------------------------
            // 内存资源
            //--------------------------------------------------------------
            public const int fMD_MemoryType = (0x1); //位掩码,无论是否是可写的存储器
            public const int fMD_ROM = (0x0); // 内存范围为只读
            public const int fMD_RAM = (0x1); // 内存范围可能会被写入        public const int fMD_32_24 = (0x2); // 掩码,内存是24位或32位
            public const int fMD_24 = (0x0); // 内存范围是24位
            public const int fMD_32 = (0x2); // 内存范围是32位        public const int fMD_Prefetchable = (0x4); // 掩码,内存是否能预取
            public const int fMD_PrefetchDisallowed = (0x0); // 不支持
            public const int fMD_PrefetchAllowed = (0x4); // 支持        public const int fMD_Readable = (0x8); // 掩码,是否可读内存
            public const int fMD_ReadAllowed = (0x0); // 可以
            public const int fMD_ReadDisallowed = (0x8); // 只写        public const int fMD_CombinedWrite = (0x10); // 掩码,支持后写
            public const int fMD_CombinedWriteDisallowed = (0x0);  //   不支持 combined-write caching
            public const int fMD_CombinedWriteAllowed = (0x10); // 支持 combined-write caching        //
            // 内存范围结构
            //
            [StructLayout(LayoutKind.Sequential)]
            public class MEM_RANGE
            {
                public UInt64 MR_Align;     // 基址对齐
                public UInt32 MR_nBytes;    // 指定所需的字节数
                public UInt64 MR_Min;       // 指定范围内的最低地址
                public UInt64 MR_Max;       // 指定范围内的最高地址
                public UInt32 MR_Flags;     // 指定标志描述范围
                public UInt32 MR_Reserved;
            };
            //
            // 内存描述结构
            //
            [StructLayout(LayoutKind.Sequential)]
            public class MEM_DES
            {
                public UInt32 MD_Count;         // 数量
                public UInt32 MD_Type;          // 大小
                public UInt64 MD_Alloc_Base;    // 内存地址分配基址范围
                public UInt64 MD_Alloc_End;     // 内存地址分配终址范围
                public UInt32 MD_Flags;         // 指定标志描述范围
                public UInt32 MD_Reserved;
            };
            //--------------------------------------------------------------
            // I/O端口资源
            //--------------------------------------------------------------        public const int fIOD_PortType = (0x1); // 掩码,无论端口是IO或内存
            public const int fIOD_Memory = (0x0); // 内存使用的端口
            public const int fIOD_IO = (0x1); // IO使用的端口        //
            // I/O端口结构
            //
            [StructLayout(LayoutKind.Sequential)]
            public class IO_RANGE
            {
                public UInt64 IOR_Align;      
                public UInt32 IOR_nPorts;     
                public UInt64 IOR_Min;        
                public UInt64 IOR_Max;        
                public UInt32 IOR_RangeFlags;
                public UInt64 IOR_Alias;
            };
            [StructLayout(LayoutKind.Sequential)]
            public class IO_DES
            {
                public UInt32 IOD_Count;          // 数量
                public UInt32 IOD_Type;           // 大小
                public UInt64 IOD_Alloc_Base;     // 端口分配基址
                public UInt64 IOD_Alloc_End;      // 端口分配终址
                public UInt32 IOD_DesFlags;       // 
            };        public const int IOA_Local = 0xff;
            //--------------------------------------------------------------
            // DMA 资源
            //--------------------------------------------------------------
            public const int mDD_Width = (0x3);    // 位掩码
            public const int fDD_BYTE = (0x0);    //   8-bit 
            public const int fDD_WORD = (0x1);    //   16-bit
            public const int fDD_DWORD = (0x2);    //   32-bit
            [StructLayout(LayoutKind.Sequential)]
            public class DMA_RANGE
            {
                public UInt32 DR_Min;
                public UInt32 DR_Max;
                public UInt32 DR_Flags;
            };        [StructLayout(LayoutKind.Sequential)]
            public class DMA_DES
            {
                public UInt32 DD_Count;       // 数量
                public UInt32 DD_Type;        // 大小
                public UInt32 DD_Flags;       // 标志位
                public UInt32 DD_Alloc_Chan;  // 指定的DMA已经被分配
            };        //--------------------------------------------------------------
            // 中断资源
            //--------------------------------------------------------------        //
            //定义为一个中断资源的范围属性标志。每个位标志识别恒定的位掩码。继位掩码的定义是可能的值。
            //
            public const int mIRQD_Share = (0x1); // 位掩码,是否可以共享的IRQ
            public const int fIRQD_Exclusive = (0x0); //   可能不能共享的IRQ
            public const int fIRQD_Share = (0x1); //   能共享的IRQ        public const int mIRQD_Edge_Level = (0x2);
            public const int fIRQD_Level = (0x0);
            public const int fIRQD_Edge = (0x2);        //
            // 中断范围
            //
            [StructLayout(LayoutKind.Sequential)]
            public class IRQ_RANGE
            {
                public UInt32 IRQR_Min;      // 最小中断
                public UInt32 IRQR_Max;      // 最大
                public UInt32 IRQR_Flags;
            };        //
            // 中断描述
            //
            [StructLayout(LayoutKind.Sequential)]
            public class IRQ_DES
            {
                public UInt32 IRQD_Count;       // 数量
                public UInt32 IRQD_Type;        // 类型
                public UInt32 IRQD_Flags;       // 标志位
                public UInt32 IRQD_Alloc_Num;   // 指定了被分配的IRQ
                public UInt32 IRQD_Affinity;
            };
            [StructLayout(LayoutKind.Sequential)]
            private class SP_DEVINFO_DATA
            {
                public int cbSize;
                public Guid ClassGuid;
                public int DevInst;    // 句柄
                public ulong Reserved;
            };        [DllImport("setupapi.dll")]
            private static extern Boolean SetupDiClassGuidsFromNameA(string ClassN, ref Guid guids, UInt32 ClassNameSize, ref UInt32 ReqSize);        [DllImport("setupapi.dll")]
            private static extern IntPtr SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator, IntPtr hwndParent, UInt32 Flags);        [DllImport("setupapi.dll")]
            private static extern Boolean SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex, SP_DEVINFO_DATA DeviceInfoData);        [DllImport("setupapi.dll")]
            private static extern Boolean SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);        [DllImport("cfgmgr32.dll")]
            private static extern UInt32 CM_Get_First_Log_Conf(ref UInt32 Conf, UInt32 DevInst, UInt32 Flag);        [DllImport("cfgmgr32.dll")]
            private static extern UInt32 CM_Get_Next_Res_Des(ref UInt32 ResHandle, UInt32 CurrConf, UInt32 TypResource, UInt32 ptr, UInt32 Flag);        [DllImport("cfgmgr32.dll")]
            private static extern UInt32 CM_Free_Res_Des_Handle(UInt32 handle);        [DllImport("cfgmgr32.dll")]
            private static extern UInt32 CM_Get_Res_Des_Data_Size(ref UInt32 handle, UInt32 ResHandle, UInt32 Flag);        [DllImport("cfgmgr32.dll")]
            private static extern UInt32 CM_Get_Res_Des_Data(UInt32 ResHandle, IntPtr buf, UInt32 size, UInt32 Flag);        static bool FResourceOpen = false;
            public static IntPtr FBufForRes;
            static UInt32 FResourceType;
            static UInt32 CurrConf;
            static IntPtr FResDeviceInfoSet;  //设备信息
            static UInt32 ResHandle;
            static UInt32 PrevResHandle;
            static bool FNoResourses;
            static UInt32 sizeResFu;
      

  3.   

    接上段:
            public DeviceResources()
            {
            }        //打开资源
            public static bool OpenResources(UInt32 TypR, string ClassName, int DeviceIndex)
            {            if (FResourceOpen)
                    return false;            FBufForRes = IntPtr.Zero;            //测试资源类型
                if ((TypR != ResType_Mem) && (TypR != ResType_IO) &&
                    (TypR != ResType_DMA) && (TypR != ResType_IRQ))
                {
                    //类型不正确则返回
                    FResourceType = TypR;
                    FResourceOpen = true;
                    CurrConf = 0;
                    FResDeviceInfoSet = IntPtr.Zero;
                    ResHandle = 0;
                    PrevResHandle = 0;
                    FNoResourses = true;
                    return false;
                }
                Guid[] guids = new Guid[1];
                UInt32 RequiredSize = 0;
                SP_DEVINFO_DATA FDeviceInfoData = new SP_DEVINFO_DATA();
                //通过类型名称返回设备信息
                bool res = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize);
                if (RequiredSize == 0)
                {
                    //类型不正确
                    return false;
                }            //通过类型名称返回设备信息
                if (!res)
                {
                    guids = new Guid[RequiredSize];
                    res = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize);                if (!res || RequiredSize == 0)
                    {
                        //类型不正确
                        return false;
                    }
                }
                //通过类型名称返回设备信息
                FResDeviceInfoSet = SetupDiGetClassDevsA(ref guids[0], 0, IntPtr.Zero, DIGCF_PRESENT);
                if (FResDeviceInfoSet.ToInt32() == -1)
                {
                    //设备不可用
                    FResourceType = TypR;
                    FResourceOpen = true;
                    CurrConf = 0;
                    FResDeviceInfoSet = IntPtr.Zero;
                    ResHandle = 0;
                    PrevResHandle = 0;
                    FNoResourses = true;
                    guids = null;
                    return false;
                }            FDeviceInfoData.cbSize = 28;
                //正常
                FDeviceInfoData.DevInst = 0;
                FDeviceInfoData.ClassGuid = System.Guid.Empty;
                FDeviceInfoData.Reserved = 0;            res = SetupDiEnumDeviceInfo(FResDeviceInfoSet,
                       (UInt32)DeviceIndex, FDeviceInfoData);
                if (!res)
                {
                    //没有该类型的设备
                    SetupDiDestroyDeviceInfoList(FResDeviceInfoSet);
                    FResourceType = TypR;
                    FResourceOpen = true;
                    CurrConf = 0;
                    FResDeviceInfoSet = IntPtr.Zero;
                    ResHandle = 0;
                    PrevResHandle = 0;
                    FNoResourses = true;
                    guids = null;
                    return false;
                }            CurrConf = 0;
                ResHandle = 0;            //打开配置
                UInt32 cmRes = CM_Get_First_Log_Conf(ref CurrConf, (UInt32)FDeviceInfoData.DevInst, 0x00000002);
                if (cmRes == CR_NO_MORE_LOG_CONF)
                {
                    cmRes = CM_Get_First_Log_Conf(ref CurrConf, (UInt32)FDeviceInfoData.DevInst, 0x00000003);
                }
                if (cmRes != CR_SUCCESS)
                {
                    //错误
                    SetupDiDestroyDeviceInfoList(FResDeviceInfoSet);
                    FResourceType = TypR;
                    FResourceOpen = true;
                    CurrConf = 0;
                    FResDeviceInfoSet = IntPtr.Zero;
                    ResHandle = 0;
                    PrevResHandle = 0;
                    FNoResourses = true;
                    guids = null;
                    return false;
                }            //获取设备资源描述
                cmRes = CM_Get_Next_Res_Des(ref ResHandle, CurrConf, TypR, 0, 0);
                if (cmRes == CR_SUCCESS)
                {
                    //OK
                    FResourceType = TypR;
                    FResourceOpen = true;
                    PrevResHandle = 0;
                    FNoResourses = false;
                    guids = null;
                    return true;
                }
                else
                {
                    //error
                    SetupDiDestroyDeviceInfoList(FResDeviceInfoSet);
                    FResourceType = TypR;
                    FResourceOpen = true;
                    CurrConf = 0;
                    FResDeviceInfoSet = IntPtr.Zero;
                    ResHandle = 0;
                    PrevResHandle = 0;
                    FNoResourses = true;
                    guids = null;
                    return false;
                }
            }        //关闭资源
            public static bool CloseResources()
            {            //
                if (FBufForRes != IntPtr.Zero) Marshal.FreeHGlobal(FBufForRes);
                if (!FResourceOpen)
                    return false;
                FResourceOpen = false;
                FResourceType = 0;            if (ResHandle != 0)
                {
                    CM_Free_Res_Des_Handle(ResHandle);
                    ResHandle = 0;
                }
                return true;
            }        //提取资源
            public static int ExtractResourceInfo(ref bool NextResExist)
            {
                UInt32 sizeRes = 0;            FBufForRes = IntPtr.Zero;            if (FNoResourses)
                {
                    NextResExist = false;
                    return -1;
                }
                if (ResHandle == 0)
                {
                    NextResExist = false;
                    return -2;
                }            //获取资源的大小
                UInt32 cmRes = CM_Get_Res_Des_Data_Size(ref sizeRes, ResHandle, 0);
                if (cmRes != CR_SUCCESS)
                {
                    NextResExist = false;
                    return -3;
                }
                sizeResFu = sizeRes;            //分配资源数据到缓冲区
                FBufForRes = Marshal.AllocHGlobal(1000);   //必须要有足够的缓冲区大小
                //获取资源数据
                cmRes = CM_Get_Res_Des_Data(ResHandle, FBufForRes, sizeResFu, 0);
                if (cmRes == CR_BUFFER_SMALL)
                    return -4;
                if (cmRes != CR_SUCCESS)
                {
                    NextResExist = false;
                    return -5;
                }            PrevResHandle = 0;
                //获得下一个资源描述(如果存在)
                cmRes = CM_Get_Next_Res_Des(ref PrevResHandle, ResHandle, FResourceType, 0, 0);
                if (cmRes == CR_SUCCESS)
                {
                    NextResExist = true;
                    CM_Free_Res_Des_Handle(ResHandle);
                    ResHandle = PrevResHandle;
                    PrevResHandle = 0;
                }
                else
                {
                    NextResExist = false;
                    CM_Free_Res_Des_Handle(ResHandle);
                    ResHandle = 0;
                    PrevResHandle = 0;
                }            return (int)sizeResFu;    //返回资源数据的大小
            }
        }
      

  4.   

    加载显示:
                #region 加载设备类型
                al = new ArrayList();
                bool DevExist = false;
                UInt32 i = 0;
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add(SystemInformation.ComputerName);
                while (true)
                {
                    StringBuilder classes = new StringBuilder("");
                    StringBuilder classDescriptions = new StringBuilder("");
                    int res = DeviceClasses.EnumerateClasses(i, classes, classDescriptions, ref DevExist);
                    if (res == DeviceClasses.CR_NO_SUCH_VALUE) break;
                    ++i;
                    if ((res != DeviceClasses.CR_NO_SUCH_VALUE && res != DeviceClasses.CR_SUCCESS) || !DevExist) continue;
                    #region 获取图标
                    IntPtr hIcon;
                    int ix;
                    Guid guid = DeviceClasses.ClassesGuid;
                    if (DeviceClasses.SetupDiLoadClassIcon(ref guid, out hIcon, out ix) != 0)
                    {
                        Icon devIcon = Icon.FromHandle(hIcon);
                        imgListTreeSmall.Images.Add(devIcon);
                        imgListTreeBig.Images.Add(devIcon);
                    }
                    int iImageIndex = imgListTreeSmall.Images.Count - 1;
                    #endregion
                    TreeNode tn = new TreeNode(classDescriptions.ToString(), iImageIndex, iImageIndex);
                    treeView1.Nodes[0].Nodes.Add(tn);
                    #region 加载设备
                    StringBuilder devices = new StringBuilder("");
                    int result = 0;
                    UInt32 Index = 0;
                    while (true)
                    {
                        result = DeviceInfo.EnumerateDevices(Index, classes.ToString(), devices);
                        Index++;
                        if (result == -2)
                        {
                            break;
                        }
                        if (result == -1)
                            break;
                        if (result == 0)
                        {
                            TreeNode tnClient = new TreeNode(devices.ToString(), iImageIndex, iImageIndex);
                            tn.Nodes.Add(tnClient);
                        }
                    }
                    #endregion
                }
                #endregion
      

  5.   

    http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/68.gif
      

  6.   

    源码下载地址:http://download.csdn.net/source/1871029
      

  7.   

    老贴子参考:http://topic.csdn.net/u/20080209/21/6ef3ddb4-c33c-41a7-9c32-bb27eaef7fae.html
      

  8.   

    CSDN不一定常在,但有空会来。如果有问题,发消息或者在该贴子中提问,看见只要知道就会回复。谢谢各位弟兄捧场。
      

  9.   

    捧场!【原创家庭记账簿1.1.1,简单实用,欢迎工薪阶层、家庭主妇下载使用
    http://download.csdn.net/source/1849003】
      

  10.   

    生日快乐!!!感谢分享!!!学习ing.....
      

  11.   

    送上祝福接到分学到甴曱(yóu yuē )
      

  12.   

    jf
    xiexie 
    非常感谢
    分分
      

  13.   

    楼主真是强,谢谢分享!学习了,顺祝楼主之lover生日快乐,祝你们永远幸福
      

  14.   

    祝lz de lp 生日快樂!