VC编程怎样检测设备是否已连接?

解决方案 »

  1.   

    How about handshaking ??
      

  2.   

    //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")
    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