VC编程怎样检测设备是否已连接?
解决方案 »
- 用MFC写的单机游戏,中间件是MFC吗?
- 向ACCESSE数据库中插入值的时候报错,但插入成功了?
- 问下 MFC 创建的窗口DLL ,怎么能调用它创建个非模态的窗口?
- 除了本主题这种方式DLL,还有其他方式吗?我觉得很不方便啊。
- 急~~~~~高手指教.....关于ActiveX属性问题.
- ADO中的Recordset如保存在Stream中并再由Stream还原
- 想换程序学习的网友请进。
- 【幽默】沙发
- 请问:如何将int型转换为float型?
- 高手!!这是真的
- 一个 SDK 程序要增加新功能,这些功能在 MFC 中很容易实现,所以想用到 MFC 的一个类。有办法实现在 SDK 引用 MFC 的类吗?
- 大家讨论一下,作为计算机专业的学生,以后开发ERP软件,需要补充那些关于信息管理方面的知识
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#pragma comment(lib,"Setupapi.lib")
void printdata(LPVOID pdata,DWORD datalen,DWORD type);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 = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("SPDRP_DEVICEDESC:[%s]\n",buffer);
if (buffer) LocalFree(buffer); buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_LOCATION_INFORMATION,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("SPDRP_LOCATION_INFORMATION:[%s]\n",buffer);
if (buffer) LocalFree(buffer); buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_ADDRESS,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("Length:%d,SPDRP_ADDRESS:",buffersize);
printdata(buffer,buffersize,DataT);
printf("\n");
if (buffer) LocalFree(buffer); }
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
} void printdata(LPVOID pdata,DWORD datalen,DWORD type)
{
if(datalen<=0)
return;
switch(type)
{
case REG_DWORD:
{
PDWORD np=(PDWORD)pdata;
printf("REG_DWORD:%d",np[0]);
}
break;
case REG_SZ:
printf("REG_SZ:%d",(LPCTSTR)pdata);
break;
default:
printf("other format");
break;
}
}
//HOWTO: Force Reenumeration of a Device Tree From an Application Q259697