を作成するプロジェクトを作成しましたDLL
。このプロジェクトはWFS
メソッドを使用し、いくつかのハードウェア (デバイス) にアクセスして情報を取得したり、いくつかのコマンドを実行したりします。
私のプロジェクトでは、まずこれらのデバイスを開いて登録し、後で他の方法を使用して情報を取得したり実行したりします。
HRESULT extern WINAPI WFSOpen ( LPSTR lpszLogicalName, HAPP hApp, LPSTR lpszAppID, DWORD dwTraceLevel, DWORD dwTimeOut, DWORD dwSrvcVersionsRequired, LPWFSVERSION lpSrvcVersion, LPWFSVERSION lpSPIVersion, LPHSERVICE lphService);
HRESULT extern WINAPI WFSRegister ( HSERVICE hService, DWORD dwEventClass, HWND hWndReg);
ご覧のとおり、パラメーターとしてがWFSRegister
必要です。このパラメーターを使用して、イベントまたはメッセージを送信します。HWND
WFSRegister
私のプロジェクトは MFC プロジェクトではなく、ウィンドウがありません。HWND
ウィンドウを作成し、正しいを に割り当てることにしましたWFSRegister
。メソッドが後で送信するWndProc
メッセージを取得するためにも作成しました。WFS
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WFS_EXECUTE_EVENT:
cout<<"WFS_EXECUTE_EVENT";
break;
case WFS_SERVICE_EVENT:
cout<<"WFS_EXECUTE_EVENT";
break;
case WFS_USER_EVENT:
cout<<"WFS_USER_EVENT";
break;
case WFS_SYSTEM_EVENT:
cout<<"WFS_SYSTEM_EVENT";
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam );
}
void Init_Window()
{
WNDCLASS Wclass;
Wclass.hInstance = gHinstance;
Wclass.cbClsExtra = 0;
Wclass.cbWndExtra = 0;
Wclass.lpszClassName = TEXT("Device_Manager_Class_Name");
Wclass.lpszMenuName = NULL;
Wclass.lpfnWndProc = WndProc;
Wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
Wclass.hCursor = LoadIcon(NULL, IDC_ARROW);
Wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
Wclass.style = CS_OWNDC;
if(!RegisterClass(&Wclass))
{
cout<<"Unable to Register Class";
}
ULONG Window_Width;
ULONG Window_Height;
DWORD style;
Window_Width = SCREEN_WIDTH;
Window_Height = SCREEN_HEIGHT;
style = WS_OVERLAPPED|WS_SYSMENU;
gHwnd = CreateWindow(TEXT("Device_Manager_Class_Name")
, TEXT("Device_Manager_Class_Title")
, style
, 0
, 0
, Window_Width
, Window_Height
, GetDesktopWindow()
, NULL
, gHinstance
, NULL);
if(!gHwnd){
cout<<"Unable to create the main window";
}
ShowWindow(gHwnd, SW_SHOW);
UpdateWindow(gHwnd);
SetFocus(gHwnd);
}
Init_Window()
ウィンドウの作成に成功しました。問題はありません。
デバイスを登録するときは、次のコードを呼び出して正しいHWND
.
HWND windows_handle = FindWindow(TEXT("Device_Manager_Class_Name"), 0);
HRESULT result = WFSRegister(wfsRes.hService, WFS_EXECUTE_EVENT || WFS_SERVICE_EVENT || WFS_USER_EVENT || WFS_SYSTEM_EVENT , windows_handle);
result
はS_OK
(デバイスが正常に登録されたことを意味します) であり、で作成しwindows_handle
たものと同じものを指します。たとえば、両方に値があります。HWND
Init_Window()
0x00100a58
デバイスのプロパティを変更すると、これらのメッセージが に表示されるWndProc()
はずですが、機能していません。
WndProc()
どういうわけか動作し、いくつかのメッセージを取得しますが、私が望むものではありません (デバイスが送信するものではありません)。
ログを読むことでデバイスがメッセージを送信していることを確認できるため、デバイスはメッセージを (イベントとして) 送信していると確信しています。
例えば:
2013/09/25 16:46:29 HService: 44 イベント WFS_SRVE_SIU_PORT_STATUS が HWND に送信されました = 330d1c hResult = WFS_SUCCESS
HWND
ログの は、とHWND
で作成したものを指します。Init_Window()
windows_handle
また、皆さんは私がやりたいことを手に入れました。他に解決策がありましたら、お気軽にご相談ください。