• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

如何列出显卡、主板、声卡、USB设备的类型、编号、状态?

cpplus 2002-05-09 01:24:01
第一次来VC版,先向大家问好:)


现在需要
1. 寻找系统中的硬件设备:列出显卡、主板、声卡、USB设备的类型、编号、状态。
2. 列出有问题的声卡设备和其他硬件

不知道有什么好的方法?

应该有相应的API吧?

是用 getSystemInfo() 吗?(我看了MSDN,十分不详细)

或者是用WMI的相关东西吗?

最好能给出完整的例子

可以回我的信箱 cpplus@163.com

或者给我发MSG

谢谢先!
...全文
75 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
custor 2002-05-12
ding
回复
whitewords 2002-05-11
我不会VC,只能帮你顶一下了
回复
taglis2002 2002-05-10
但见红星点点。。。

某是应楼主于西瓜贴上广告来推一下的,

不知楼主想实现甚么?

用ASP+ACCESS的某有现成的例子,你要不要?

恭喜你是第十二位幸运楼主,

赠一个新版鸿禧通宝:

◢ 鸿 ◣
|寳 ○ 通|
◥ 禧 ◤

:)。。。
回复
tianlinyi 2002-05-10
up
回复
yj33cn 2002-05-10
,
回复
xinpingf 2002-05-10
masterz() 是谁啊,5颗星?
回复
freefeel 2002-05-10
回复
cpplus 2002-05-10
推一下~~~:)
回复
cpplus 2002-05-10
特别感谢参与这个问题的朋友:)

现在已经可以得到设备的名字:)

但是在调试设备的状态的时候,我查到SetupDiGetDeviceInterfaceDetail

但是不会用,确切的说是没有得到结果出来(VC果然不是很容易)

麻烦大家看看这个API怎么用?

谢谢~~~
回复
masterz 2002-05-09
//make sure you have Setupapi.lib
//refer to HOWTO: Enumerate Hardware Devices by Using SetupDi Calls Q259695

#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#pragma comment(lib,"Setupapi.lib")
int main( int argc, char *argv[ ], char *envp[ ] )
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );
if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}
// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

//
// Call function with null to begin with,
// then use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}

printf("Result:[%s]\n",buffer);

if (buffer) LocalFree(buffer);
}


if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
回复
cpplus 2002-05-09
十分感谢两位的帮助,调试通不过:((

buffer = LocalAlloc(LPTR,buffersize); // 这里出错error C2440: '=' : cannot convert from 'void *' to 'char *'

我用buffer = (char *)LocalAlloc(LPTR,buffersize);//不行:((

大家再帮帮忙:))

本来想下一个DDK自己看,结果有40多M,看来是不行了

谢谢AGAIN
回复
kkk16 2002-05-09
主要用到函数:
hDevInfo = SetupDiGetClassDevs(NULL,
REGSTR_KEY_PCIENUM, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );



例子如下:



#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>

int main( int argc, char *argv[ ], char *envp[ ] )
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );

if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}

// Enumerate through all devices in Set.

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

//
// Call function with null to begin with,
// then use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}

printf("Result:[%s]\n",buffer);

if (buffer) LocalFree(buffer);
}


if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}

// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;
}
回复
masterz 2002-05-09
HOWTO: Enumerate Hardware Devices by Using SetupDi Calls (Q259695)
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q259695
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-09 01:24
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……