windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/dx8/diquick/diqfind.c
2020-09-26 16:20:57 +08:00

228 lines
5.4 KiB
C

/*****************************************************************************
*
* diqfind.c
*
* The dialog box that tests IDirectInput2::FindDevice.
*
*****************************************************************************/
#include "diquick.h"
#include "dinputd.h"
/*****************************************************************************
*
* Find dialog instance data
*
* Instance data for FindDevice dialog box.
*
*****************************************************************************/
typedef struct FINDDLGINFO {
HWND hdlgOwner; /* Owner window */
BOOL fOle; /* Should we create via OLE? */
UINT flCreate; /* Flags */
IDirectInput2 *pdi2; /* The thing we created */
} FINDDLGINFO, *PFINDDLGINFO;
/*****************************************************************************
*
* Find_OnInitDialog
*
*****************************************************************************/
BOOL INTERNAL
Find_OnInitDialog(HWND hdlg, LPARAM lp)
{
PFINDDLGINFO pfind = (PV)lp;
HWND hwnd;
SetDialogPtr(hdlg, pfind);
hwnd = GetDlgItem(hdlg, IDC_FIND_NAME);
Edit_LimitText(hwnd, MAX_PATH);
return 1;
}
/*****************************************************************************
*
* Find_OnInitDialog
*
*****************************************************************************/
BOOL INTERNAL
Find_OnFind(HWND hdlg)
{
PFINDDLGINFO pfind = GetDialogPtr(hdlg);
GUID guid;
HRESULT hres;
TCHAR tsz[MAX_PATH];
union {
CHAR sz[MAX_PATH];
WCHAR wsz[MAX_PATH];
} u;
/*
* tsz must be a separate buffer because
* WideCharToMultiByte / MultiByteToWideChar
* don't support converting to/from the same buffer...
*/
GetDlgItemText(hdlg, IDC_FIND_NAME, tsz, cA(tsz));
UnconvertString(pfind->flCreate & CDIFL_UNICODE,
tsz, &u, MAX_PATH);
hres = IDirectInput2_FindDevice(pfind->pdi2, &GUID_HIDClass,
(LPVOID)&u, &guid);
if (SUCCEEDED(hres)) {
StringFromGuid(tsz, &guid);
} else {
wsprintf(tsz, TEXT("Error %08x"), hres);
}
SetDlgItemText(hdlg, IDC_FIND_GUID, tsz);
return 1;
}
/*****************************************************************************
*
* Find_OnCommand
*
*****************************************************************************/
BOOL INTERNAL
Find_OnCommand(HWND hdlg, int id, UINT cmd)
{
switch (id) {
case IDC_FIND_FIND: return Find_OnFind(hdlg);
}
return 0;
}
/*****************************************************************************
*
* Find_DlgProc
*
*****************************************************************************/
INT_PTR INTERNAL
Find_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_INITDIALOG:
return Find_OnInitDialog(hdlg, lp);
case WM_DESTROY:
/*
* Find_ThreadStart will do the cleanup for us.
*/
break;
case WM_COMMAND:
return Find_OnCommand(hdlg,
(int)GET_WM_COMMAND_ID(wp, lp),
(UINT)GET_WM_COMMAND_CMD(wp, lp));
case WM_CLOSE:
DestroyWindow(hdlg);
return TRUE;
}
return 0;
}
/*****************************************************************************
*
* Find_DoFind
*
*****************************************************************************/
void INLINE
Find_DoFind(PFINDDLGINFO pfind)
{
SendNotifyMessage(pfind->hdlgOwner, WM_THREADSTARTED, 0, 0);
/*
* This function also sends the WM_CHILDEXIT.
*/
SemimodalDialogBoxParam(IDD_FIND, pfind->hdlgOwner, Find_DlgProc,
(LPARAM)pfind);
}
/*****************************************************************************
*
* Find_ThreadStart
*
* Runs on the new thread. Creates the object and spins the dialog
* box to control it.
*
*****************************************************************************/
DWORD WINAPI
Find_ThreadStart(PFINDDLGINFO pfind)
{
HRESULT hres;
hres = CoInitialize(0);
if (SUCCEEDED(hres)) {
hres = CreateDI(pfind->fOle, CDIFL_DI2 | pfind->flCreate,
(PPV)&pfind->pdi2);
if (SUCCEEDED(hres)) {
Find_DoFind(pfind);
IDirectInput_Release(pfind->pdi2);
} else {
ThreadFailHres(pfind->hdlgOwner, IDS_ERR_CREATEOBJ, hres);
}
CoUninitialize();
} else {
ThreadFailHres(pfind->hdlgOwner, IDS_ERR_COINIT, hres);
}
LocalFree(pfind);
return 0;
}
/*****************************************************************************
*
* Find_Create
*
* Spin a thread to create a DirectInput device interface.
*
*****************************************************************************/
INT_PTR EXTERNAL
Find_Create(HWND hdlg, BOOL fOle, UINT flCreate)
{
PFINDDLGINFO pfind = LocalAlloc(LPTR, cbX(FINDDLGINFO));
if (pfind) {
DWORD id;
HANDLE h;
pfind->hdlgOwner = hdlg ;
pfind->fOle = fOle ;
pfind->flCreate = flCreate ;
h = CreateThread(0, 0, Find_ThreadStart, pfind, 0, &id);
if (h) {
} else {
LocalFree(pfind);
pfind = 0;
}
}
return (INT_PTR)pfind;
}