请教各位,如何做到在windows95/98/me/2000/xp下检测是否已安装好modem,并获取相应硬件信息。

解决方案 »

  1.   

    最简单就是:
    1.用CreateFile()打开COM口;
    2.用WriteFile()向COM口发送at命令串,如发送询问厂商信息的at命令:"ati3\r"
    3.根据Modem的响应,判断是否安装。
      

  2.   

    以上都不对,应该是先查找当前windows版本,然后读取相应的键值以获得相关安装信息,然后才是modem编程。但具体获得什么键值我忘了,不知哪位大虾能帮忙想起来还是说有什么方法可以找到相应帮助文档。
      

  3.   

    明天,我以前做过!显示出机器上安装的所有MODEM
      

  4.   

    SetUpEnum可以的
    这是我写的函数。
    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;
    }