請教各位大大, 我在寫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 請各位大大指教,謝謝