基于win32的USB识别程序

最近遇到客户提出插入我们公司加密锁产品,弹出指定锁内网址页面的需求,其中需要用到usb设别相关程序,对于我这样的VC小白来说,首先只能先搜资料了,废话不多说,直接上demo。
#include   
#include   
#include   
#include   
  
#include   
  
/*------------------------------------------------------------------ 
FirstDriveFromMask( unitmask ) 
 
Description 
Finds the first valid drive letter from a mask of drive letters. 
The mask must be in the format bit 0 = A, bit 1 = B, bit 2 = C,  
and so on. A valid drive letter is defined when the  
corresponding bit is set to 1. 
 
Returns the first drive letter that was found. 
--------------------------------------------------------------------*/  
char FirstDriveFromMask(ULONG unitmask)  
{  
    char i;  
      
    for (i = 0; i < 26; ++i)  
    {  
        if (unitmask & 0x1)  
            break;  
        unitmask = unitmask >> 1;  
    }  
      
    return(i + 'A');  
}  
  
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{  
    PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;  
    PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;  
    TCHAR szMsg[80];  
    char driveName;  
      
    switch(uMsg)  
    {  
    case WM_DEVICECHANGE:  
        switch(wParam )  
        {  
        case DBT_DEVICEARRIVAL:  
                driveName = FirstDriveFromMask(lpdbv->dbcv_unitmask);  
                sprintf(szMsg, "USB Drive %c: has inserted.\n", driveName);  
                printf("%s\r\n", szMsg);  
                MessageBox(hWnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK);  
            break;  
        case DBT_DEVICEREMOVECOMPLETE:  
                driveName = FirstDriveFromMask(lpdbv->dbcv_unitmask);  
                sprintf(szMsg, "USB Drive %c: has removed.\n", driveName);  
                printf("%s\r\n", szMsg);  
                MessageBox(hWnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK );  
            break;  
        default:  
            ;  
        }  
        break;  
        default:  
            ;  
    }  
      
    return DefWindowProc(hWnd, uMsg, wParam, lParam);  
}  
  
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])  
{  
    TCHAR szClassName[] = _T("MyApp");  
    WNDCLASS wndcls = {0};  
    wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  
    wndcls.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW);  
    wndcls.hIcon = (HICON)LoadIcon(NULL, IDI_APPLICATION);  
    wndcls.lpfnWndProc = WndProc;  
    wndcls.lpszClassName = szClassName;  
    if(!RegisterClass(&wndcls))  
    {  
        printf("RegisterClass Failed!\r\n");  
        return 0;  
    }  
      
    HWND hWnd = CreateWindow(szClassName, szClassName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,  
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL);  
    if(NULL == hWnd)  
    {  
        printf("CreateWindow Failed!\r\n");  
        return 0;  
    }  
    ShowWindow(hWnd, SW_HIDE);  
    UpdateWindow(hWnd);  
      
    MSG msg;  
    while(GetMessage(&msg, NULL, NULL, NULL))  
    {  
        TranslateMessage(&msg);  
        DispatchMessage(&msg);  
    }  
    return 0;  
}  
可是问题来了,这两个信号:DBT_DEVICEARRIVAL:  DBT_DEVICEREMOVECOMPLETE:  只能分别对应U盘的插入和拔出,针对加密锁却无半点响应。抓耳挠腮不得其解情况下,直接插拔加密锁让它打印:switch(wParam )中的wParam,结果打印的数为0X0007,对应宏为:DBT_DEVNODES_CHANGED,找到对应解释为: / *
*消息= WM_DEVICECHANGE
*按钮= DBT_DEVNODES_CHANGED
* lParam = 0
*
*发送当configmg结束进程树一批。 一些devnodes
*可能被添加或删除。 这是被ring3人使用
*需要刷新任何devnode改变(如发生
*设备管理器)。 人们应该使用特定于特定设备
* DBT_DEVICE *。

* /

不太懂为何如此,也闹不清普通U盘和我们加密锁的关于USB驱动的实质区别,但是目前问题已经解决,至于原因如何,日后深究,先以此文记之,留作备忘。

你可能感兴趣的:(嵌入式arm)