全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3713
推到 Plurk!
推到 Facebook!

請教各位HID user client 問題

尚未結案
tglee
一般會員


發表:10
回覆:18
積分:5
註冊:2004-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-17 16:24:11 IP:60.248.xxx.xxx 未訂閱
請教各位大大,    我在寫user client driver 時發現一些問題,    我的Code 如下:    
    #include 
#pragma hdrstop
#include 
extern "C"
{
#include "e:\WINDDK\2600\inc\wxp\hidsdi.h"    }    #include "Unit1.h"    //---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;    BOOL bID;
GUID gGuid;
DWORD Instance = 0;
USHORT InputReportLen = 0, OutputReportLen = 0;    HANDLE rr;    int ttest = 0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
//------ Get Hid Class GUID ---------;
HidD_GetHidGuid(&gGuid);    }
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{         RichEdit1->Lines->Clear();
 char vid[50];
 char pid[50];     //--- Get Hid Class Handle ---;     HDEVINFO info = SetupDiGetClassDevs(&gGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
        if(info==INVALID_HANDLE_VALUE)
        {
        ShowMessage("Invaild_Handle");
        }
 SP_DEVICE_INTERFACE_DATA ifdata;
 ifdata.cbSize = sizeof(ifdata);
 //--- Obtain Each Hid Device Information -----;     if(!SetupDiEnumDeviceInterfaces(info,NULL,&gGuid,1,&ifdata))
   {
    Label5->Caption = "(No Find Any Hid Device Guid)";
    //--- If have no device found, we need to release the memory ----;
    SetupDiDestroyDeviceInfoList(info);       }
 else
   {
 //-- At Here,we need to call SetupdiGetDeviceInterfaceDetail two times,
 //-- First call ,we get data size,another call we get strings ----;
 //1. Get size of symbolic link name
    DWORD ReqLen;
    SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);
    PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);        if( ifDetail == NULL)
    {
    SetupDiDestroyDeviceInfoList(info);        }
   // Get symbolic link name
   ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);       if(!SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL,NULL))
   {        SetupDiDestroyDeviceInfoList(info);
    ShowMessage("1");
    delete ifDetail;
    return;
   }
    ShowMessage("2");               rr = CreateFile( ifDetail->DevicePath,
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);                if(rr == INVALID_HANDLE_VALUE)
        {            Label5->Caption = "(Not Found Hid Device)";//   (AnsiString)dw;
        SetupDiDestroyDeviceInfoList(info);
        }
        else
        {
        Label5->Caption = "(Found Hid Device)";
        }
        delete ifDetail;
        SetupDiDestroyDeviceInfoList(info);       }
}
//---------------------------------------------------------------------------    我在插入usb keyboard 後,想找出keyboard 的VID/PID    不過還沒找VID /PID 之前,就發生問題了
問題在CreateFile 之前的 SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL,NULL)    我在裏面做一個ShowMessage("1");
在Return 後 加一個ShowMessage("2");    不過只有ShowMessage("1") 有執行到
顯然 是SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL,NULL)    傳回值就有問題了,這是為甚麼?    我的作業系統是WinXP Professional,開發環境 BCB 6.0    請各位大大指教,謝謝        
c8631506
一般會員


發表:3
回覆:9
積分:2
註冊:2004-11-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-20 09:35:21 IP:210.66.xxx.xxx 未訂閱
您好~~ 我之前也遇過類似的問題... 相關的問題回答在此網頁, 請您參考~~ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=60350
tglee
一般會員


發表:10
回覆:18
積分:5
註冊:2004-10-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-20 10:04:17 IP:60.248.xxx.xxx 未訂閱
Dear c8631506 兄, 謝謝您的回覆, 我有兩套系統,一套為WinXP Pro ,BCB 6.0              另一套為Win2000 Pro,BCB 5.0 我在Win2000 BCB5.0 下,程式都正常,也可抓到VID/PID 不過,在WinXP BCB6.0 VID,PID 都無顯示 我查了一下,結果就如我提到的問題,真奇怪阿 
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-20 16:33:57 IP:61.66.xxx.xxx 未訂閱
改成ifDetail->cbSize = 5; 試試看(別問我為什麼用5)
tglee
一般會員


發表:10
回覆:18
積分:5
註冊:2004-10-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-20 17:08:38 IP:60.248.xxx.xxx 未訂閱
ㄟ...還真的可以耶, 謝謝您阿...,不過還真是奇怪-_-    如能說出為何用5 就更好了    非常謝謝!!!< >< >,blk5743 大大~~
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-20 20:31:47 IP:61.66.xxx.xxx 未訂閱
你的問題應該是sizeof()函式算錯了 你可以看一下你是錯在哪一個部份,去檢查一下sizeof()算出來的值 和你實際到.h檔算的結構大小的size是否一樣,再對照VC的sizeof() 你會發現BCB算出來的值似乎不對(不是每個結構都算錯) typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA { DWORD cbSize; TCHAR DevicePath[ANYSIZE_ARRAY]; } SP_DEVICE_INTERFACE_DETAIL_DATA, *PSP_DEVICE_INTERFACE_DETAIL_DATA; 別問我的原因是我不知道為什麼會算錯
brooklin
一般會員


發表:15
回覆:11
積分:5
註冊:2003-10-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-21 09:47:37 IP:210.68.xxx.xxx 未訂閱
這個問題我遇過,BCB6 的Data alignment會預設為Quad word,所以size計算會不同,將Project\Options\Advanced Compiler\Data alignment選項設為”Byte”即可~
tglee
一般會員


發表:10
回覆:18
積分:5
註冊:2004-10-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-21 09:58:45 IP:60.248.xxx.xxx 未訂閱
謝謝,謝謝 非常清楚和了解 可惜沒分數可給了 謝謝三位大大~~
系統時間:2024-04-29 17:00:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!