TNB Library
TnbUsbGuidFinder.h
[詳解]
1#pragma once
13#include "TnbDef.h"
14#include <SetupApi.h>
15#pragma comment(lib, "setupapi.lib")
16
17
18
19//TNB Library
20namespace TNB
21{
22
23
24
36{
37 GUID m_guid;
38 HDEVINFO m_hDevInfo;
39 DWORD m_dwIndex;
40 DWORD m_dwLastError;
41
48 bool m_GetDevInfo(DWORD index)
49 {
50 ASSERTLIB( m_hDevInfo != NULL );
51 SP_DEVICE_INTERFACE_DATA tDevIfData;
52 tDevIfData.cbSize = sizeof(tDevIfData); // サイズを設定
53 // デバイス情報セット内の各デバイス インターフェースを列挙
54 if ( ! ::SetupDiEnumDeviceInterfaces(
55 m_hDevInfo, // インターフェイス情報を取得するデバイスが含まれているデバイス情報セットへのポインタ
56 NULL, // 未使用
57 &m_guid, // 要求するインターフェイスのデバイスインターフェイスクラスを指定する、1つのGUIDへのポインタ
58 index, // デバイス情報セット内のインターフェイスリストに対して、0で始まるインデックス番号
59 &tDevIfData // 関数が成功した場合に、書き込みの完了したSP_DEVICE_INTERFACE_DATA構造体を保持するバッファへのポインタ
60 )
61 )
62 {
63 m_dwLastError = ::GetLastError();
64 }
65 else
66 {
67 // 指定されたデバイスインターフェイスに関する詳細情報を返します
68 // 詳細データ構造体サイズを取得
69 DWORD dwReqSize;
70 SP_DEVINFO_DATA tDevInfoData;
71 tDevInfoData.cbSize = sizeof(tDevInfoData);
72 ::SetupDiGetDeviceInterfaceDetail(
73 m_hDevInfo, // インターフェイスとその基になるデバイスが含まれるデバイス情報セットへのポインタ
74 &tDevIfData, // インターフェイスを識別する1つのSP_DEVICE_INTERFACE_DATA構造体へのポインタ
75 NULL, // サイズ取得するため、NULL (指定されたインターフェイスに関する情報を受け取る1つのSP_DEVICE_INTERFACE_DETAIL_DATA構造体へのポインタ)
76 0, // サイズ取得するため、0 (DeviceInterfaceDetailDataが指すバッファのサイズ)
77 &dwReqSize, // DeviceInterfaceDetailDataが指すバッファが必要とするサイズを受け取る、1つの変数へのポインタ
78 &tDevInfoData // 要求されたインターフェイスを公開しているデバイスに関する情報を受け取る、1つのSP_DEVINFO_DATA構造体へのポインタ
79 );
80 CWorkMem work(dwReqSize);
81 PSP_DEVICE_INTERFACE_DETAIL_DATA pDevIfDetailData
82 = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(work.Ref());
83 pDevIfDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
84 if ( ! ::SetupDiGetDeviceInterfaceDetail(
85 m_hDevInfo, // インターフェイスとその基になるデバイスが含まれるデバイス情報セットへのポインタ
86 &tDevIfData, // インターフェイスを識別する1つのSP_DEVICE_INTERFACE_DATA構造体へのポインタ
87 pDevIfDetailData, // 指定されたインターフェイスに関する情報を受け取る1つのSP_DEVICE_INTERFACE_DETAIL_DATA構造体へのポインタ
88 dwReqSize, // DeviceInterfaceDetailDataが指すバッファのサイズ
89 &dwReqSize, // DeviceInterfaceDetailDataが指すバッファが必要とするサイズを受け取る、1つの変数へのポインタ
90 &tDevInfoData // 要求されたインターフェイスを公開しているデバイスに関する情報を受け取る、1つのSP_DEVINFO_DATA構造体へのポインタ
91 )
92 )
93 {
94 m_dwLastError = ::GetLastError();
95 }
96 else
97 {
98 m_dwLastError = OnFound(pDevIfDetailData->DevicePath);
99 }
100 }
101 return m_dwLastError == ERROR_SUCCESS;
102 }
103
109 bool m_Find(void)
110 {
111 Close();
112 // 指定されたクラスに所属するすべてのデバイスが含まれている1つのデバイス情報セットを返します
113 m_hDevInfo = ::SetupDiGetClassDevs(
114 &m_guid, // セットアップクラスのクラスGUIDへのポインタ
115 NULL, // システムのすべてのデバイスインスタンスに関するデバイス情報を取得
116 0, // このセットのメンバに関連するすべてのユーザーインターフェイスが利用する、トップレベルウィンドウのハンドルを指定
117 (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE) // 現在存在するデバイス | ClassGuidで指定されたインターフェイスクラスに所属するインターフェイスを公開しているデバイス
118 );
119 m_dwIndex = 0;
120 m_dwLastError = 0;
121 if ( m_hDevInfo != NULL )
122 {
123 m_GetDevInfo(m_dwIndex);
124 if ( m_dwLastError != ERROR_NO_MORE_ITEMS )
125 {
126 m_dwIndex++;
127 return true;
128 }
129 Close();
130 }
131 else
132 {
133 m_dwLastError = ::GetLastError();
134 }
135 return false;
136 }
137protected:
138
145 virtual DWORD OnFound(LPCTSTR lpszDevicePath) = 0;
146
151 virtual void OnClosed(void) = 0;
152
153public:
154
156 CAbstractUsbGuidFinder(void) : m_hDevInfo(NULL), m_dwIndex(0), m_dwLastError(0)
157 {
158 Zero(m_guid);
159 }
160
165 void Close(void)
166 {
167 if ( m_hDevInfo != NULL )
168 {
169 ::SetupDiDestroyDeviceInfoList(m_hDevInfo);
170 m_hDevInfo = NULL;
171 OnClosed();
172 }
173 }
174
180 bool IsFinding(void) const
181 {
182 return m_hDevInfo != NULL;
183 }
184
191 bool Find(const GUID& g)
192 {
193 m_guid = g;
194 return m_Find();
195 }
196
204 bool Next(void)
205 {
206 m_GetDevInfo(m_dwIndex);
207 if ( m_dwLastError == ERROR_NO_MORE_ITEMS )
208 {
209 Close();
210 return false;
211 }
212 m_dwIndex++;
213 return true;
214 }
215
222 DWORD GetLastError(void) const
223 {
224 return m_dwLastError;
225 }
226};
227
228
229
241{
242 DEFSUPER(CAbstractUsbGuidFinder);
243 CSimpleStr m_devicePathName;
244protected:
251 virtual DWORD OnFound(LPCTSTR lpszDevicePath)
252 {
253 m_devicePathName = lpszDevicePath;
254 return 0;
255 }
256
261 virtual void OnClosed(void)
262 {
263 m_devicePathName.Empty();
264 }
265
266public:
269 {
270 }
271
276 LPCTSTR GetDevicePathName(void) const
277 {
278 return m_devicePathName;
279 }
280};
281
282
283
284}; // TNB
TNBライブラリの定義ヘッダ
DEVICE 検索クラス
bool Next(void)
[検索] 次検索
virtual void OnClosed(void)=0
[通知] クローズ.
void Close(void)
[設定] クローズ.
bool Find(const GUID &g)
[検索] 検索開始.
virtual DWORD OnFound(LPCTSTR lpszDevicePath)=0
[通知] 発見.
bool IsFinding(void) const
[確認] 検索中確認
DWORD GetLastError(void) const
[取得] エラー情報取得
CAbstractUsbGuidFinder(void)
コンストラクタ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
簡易文字列管理クラス.
Definition: TnbDef.h:772
void Empty(void)
[操作] 空化
Definition: TnbDef.h:835
DEVICE検索クラス
virtual DWORD OnFound(LPCTSTR lpszDevicePath)
[通知] 発見.
LPCTSTR GetDevicePathName(void) const
[取得] 発見デバイスパス名取得.
CUsbGuidFinder(void)
コンストラクタ
virtual void OnClosed(void)
[通知] クローズ.
const TYP * Ref(void) const
[取得] ポインタ取得
Definition: TnbDef.h:712
void Zero(V &value)
[設定] ゼロクリア.
Definition: TnbDef.h:399
TNB Library
Definition: TnbDoxyTitle.txt:2