请教各位,如何做到在windows95/98/me/2000/xp下检测是否已安装好modem,并获取相应硬件信息。
解决方案 »
- mfc中listcontrol的item不能完全显示大于列宽的内容?
- 如何使combobox的下拉框中只显示N个ietms?
- 求一个VC小游戏
- VC++ 在非unicode程序下如何读取unicode文本文件,并把unicode文本显示出来
- 使用位图作为鼠标指针的问题
- InstallShield的问题,program和endprogram在哪???????????????????
- 一open就出错?如何解决?
- 我从网上下在的<<VC6.0 21天自学.asp>>请问 .asp 使用什么打开的?
- 关于COM/DCOM的问题,高分相送
- postmessage的问题
- 为什么 CArchive 的ReadString()函数不能得到相关文件数据。
- 传文件出现顺序相反的现象
1.用CreateFile()打开COM口;
2.用WriteFile()向COM口发送at命令串,如发送询问厂商信息的at命令:"ati3\r"
3.根据Modem的响应,判断是否安装。
这是我写的函数。
BOOL GetModemList(GLOBALVAL * pVal)
{
DeviceInfo ModemNode;
GUID ClassGuid = {0x4D36E96D, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18};
HDEVINFO hDevInfoSetClass = NULL;
SP_DEVINFO_DATA DevInfoData;
BOOL fFoundDevice = FALSE;
WCHAR wszInstID[MAX_PATH];
DWORD dwStatus = 0;
DWORD dwProblem = 0;
BOOL fIsDisabled = FALSE;
hDevInfoSetClass = SetupDiGetClassDevs(&ClassGuid,
NULL,
NULL,
DIGCF_PRESENT |DIGCF_PROFILE
);
if (hDevInfoSetClass == NULL)
return FALSE;
for(DWORD dwIndex = 0;;++dwIndex)
{
ZeroMemory(&DevInfoData, sizeof(SP_DEVINFO_DATA));
ZeroMemory(wszInstID, MAX_PATH);
DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if(!SetupDiEnumDeviceInfo(hDevInfoSetClass, dwIndex, &DevInfoData))
{
if (GetLastError() == ERROR_NO_MORE_ITEMS)
break;
else
return FALSE;
}
if (CR_SUCCESS != CM_Get_DevNode_Status(&dwStatus, &dwProblem, DevInfoData.DevInst, 0))
return FALSE;
fIsDisabled = (dwStatus&DN_HAS_PROBLEM)&&(CM_PROB_DISABLED == dwProblem);
if (fIsDisabled ==0)
ModemNode.status = DS_Normal;
else
ModemNode.status = DS_Disabled;
if(!SetupDiGetDeviceInstanceId(hDevInfoSetClass,
&DevInfoData,
ModemNode.id.wszPnpDeviceID,
MAX_PATH,
0))
{
return FALSE;
}
if(!SetupDiGetDeviceRegistryPropertyW(hDevInfoSetClass,
&DevInfoData,
SPDRP_FRIENDLYNAME,
NULL,
(PBYTE)ModemNode.id.wszFriendlyName,
MAX_PATH*sizeof(WCHAR),
NULL))
SetupDiGetDeviceRegistryPropertyW(hDevInfoSetClass,
&DevInfoData,
SPDRP_DEVICEDESC,
NULL,
(PBYTE)ModemNode.id.wszFriendlyName,
MAX_PATH*sizeof(WCHAR),
NULL);
pVal->vtModem.push_back(ModemNode);
}
return TRUE;
}