?»??»?//--------------------------------------------------------------------------- #include #include #pragma hdrstop #include "Unit1.h" extern "C" { #include "hidsdi.h" #include "setupapi.h" } //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //vid,pid comparation void vid_pid_comp(); HANDLE GetDeviceHandle(GUID guid, HANDLE hDev, DWORD dwDevice, BOOL bIn); //usb_attached void usb_attached(); char device_attatched=0; //declaration variable for vid,pid comparison HANDLE m_hHidOut,m_hHidIn; GUID guid; HDEVINFO hDeviceInfo; HIDD_ATTRIBUTES hid_attribute; //data receive char INBuffer[5]; DWORD BytesRead; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)//normal mode { if((Edit1->Text=="")||(Edit2->Text=="")) device_attatched=0; else vid_pid_comp(); usb_attached();//check device attatched } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)//OP Cab mode { if((Edit1->Text=="")||(Edit2->Text=="")) device_attatched=0; else vid_pid_comp(); usb_attached(); //check device attatched } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender)//Flash mode { if((Edit1->Text=="")||(Edit2->Text=="")) device_attatched=0; else vid_pid_comp(); usb_attached(); //check device attatched } //--------------------------------------------------------------------------- void vid_pid_comp() { DWORD dwIndex; //¨ú±oHIDªºGUID­È HidD_GetHidGuid(&guid); //¨ú±o¥Ø«eHID¸Ë¸mªº¸ê°T hDeviceInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); //§PÂ_¬O§_¸ê°T¨ú±o¦¨¥\ if(hDeviceInfo==INVALID_HANDLE_VALUE) device_attatched=0; for(dwIndex=0;dwIndex<=10;dwIndex++) { //Out Handle m_hHidOut=GetDeviceHandle(guid, hDeviceInfo, dwIndex,FALSE); if(m_hHidOut!=INVALID_HANDLE_VALUE) { // ¨ú±oHID attribute if(HidD_GetAttributes(m_hHidOut, &hid_attribute)) { // ¤ñ¹ïVID & PID if((hid_attribute.VendorID == StrToInt("0x"+Form1->Edit1->Text)) && (hid_attribute.ProductID == StrToInt("0x"+Form1->Edit2->Text))) { //In Handle m_hHidIn = GetDeviceHandle(guid, hDeviceInfo, dwIndex,TRUE); device_attatched=1; break; } else { device_attatched=0; CloseHandle(m_hHidOut); m_hHidOut = NULL; } } } } } HANDLE GetDeviceHandle(GUID guid, HANDLE hDev, DWORD dwDevice, BOOL bIn) { //«Å§iinterfaceªº¸ê®Æ SP_DEVICE_INTERFACE_DATA interfaceDev; SP_INTERFACE_DEVICE_DETAIL_DATA *pDeviceDetail; HANDLE hDevice; DWORD dwSize; DWORD get_error_code; //«Å§iinterface¸ê®Æªº¤j¤p interfaceDev.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); //Get interface dwSize = 0; //¸Ë¸m¦CÁ| if(!SetupDiEnumDeviceInterfaces(hDev, NULL, &guid, dwDevice, &interfaceDev)|| SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, NULL, 0, &dwSize, NULL)) return INVALID_HANDLE_VALUE; //Create buffer pDeviceDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(dwSize); pDeviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if(!SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, pDeviceDetail, dwSize, &dwSize, NULL)) { free(pDeviceDetail); return INVALID_HANDLE_VALUE; } //Get device handle if(bIn)//Device to Host { hDevice = CreateFile(pDeviceDetail->DevicePath, // GENERIC_READ, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); get_error_code=GetLastError(); } else //Host to Device { hDevice = CreateFile(pDeviceDetail->DevicePath, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); get_error_code=GetLastError(); } free(pDeviceDetail); return hDevice; } void usb_attached() { bool test; if(device_attatched) //device is attatched { Form1->Shape1->Brush->Color=clGreen; test=ReadFile(m_hHidIn, INBuffer, 5, &BytesRead, 0); if(test) { Form1->Edit3->Text=INBuffer[0]; Form1->Edit4->Text=INBuffer[1]; Form1->Edit5->Text=INBuffer[2]; Form1->Edit6->Text=INBuffer[3]; Form1->Edit7->Text=INBuffer[4]; } } else //device is not attatched Form1->Shape1->Brush->Color=clRed; }