📄 hclient.c
字号:
/*++
Copyright (c) Microsoft 1998, All Rights Reserved
Module Name:
hclient.c
Abstract:
This module contains the code for handling HClient's main dialog box and
for performing/calling the appropriate other routines.
Environment:
User mode
Revision History:
Nov-97 : Created
--*/
#define __HCLIENT_C__
#define LOG_FILE_NAME NULL
//****************************************************************************
// HClient include files
//****************************************************************************
#include <windows.h>
#include <stdlib.h>
#include <wtypes.h>
#include <math.h>
#include <assert.h>
#include <dbt.h>
#include "hidsdi.h"
#include "hid.h"
#include "resource.h"
#include "hclient.h"
#include "buffers.h"
#include "ecdisp.h"
#include "list.h"
#include <strsafe.h>
//****************************************************************************
// Local display macro definitions
//****************************************************************************
#define INPUT_BUTTON 1
#define INPUT_VALUE 2
#define OUTPUT_BUTTON 3
#define OUTPUT_VALUE 4
#define FEATURE_BUTTON 5
#define FEATURE_VALUE 6
#define HID_CAPS 7
#define DEVICE_ATTRIBUTES 8
#define MAX_LB_ITEMS 200
#define MAX_WRITE_ELEMENTS 100
#define MAX_OUTPUT_ELEMENTS 50
#define CONTROL_COUNT 9
#define MAX_LABEL 128
#define MAX_VALUE 128
#define SMALL_BUFF 128
//****************************************************************************
// Macro definition to get device block from the main dialog box procedure
//****************************************************************************
#define GET_CURRENT_DEVICE(hDlg, pDevice) \
{ \
pDevice = NULL; \
iIndex = (INT) SendDlgItemMessage(hDlg, \
IDC_DEVICES, \
CB_GETCURSEL, \
0, \
0); \
if (CB_ERR != iIndex) { \
pDevice = (PHID_DEVICE) SendDlgItemMessage(hDlg, \
IDC_DEVICES, \
CB_GETITEMDATA, \
iIndex, \
0); \
} \
}
//****************************************************************************
// Data types local to the HClient display routines
//****************************************************************************
typedef struct rWriteDataStruct_type
{
char szLabel[MAX_LABEL];
char szValue[MAX_VALUE];
} rWriteDataStruct, *prWriteDataStruct;
typedef struct rGetWriteDataParams_type
{
prWriteDataStruct prItems;
int iCount;
} rGetWriteDataParams, *prGetWriteDataParams;
typedef struct _DEVICE_LIST_NODE
{
LIST_NODE_HDR Hdr;
HDEVNOTIFY NotificationHandle;
HID_DEVICE HidDeviceInfo;
BOOL DeviceOpened;
} DEVICE_LIST_NODE, *PDEVICE_LIST_NODE;
//****************************************************************************
// Global program variables
//****************************************************************************
//
// Pointers to the HID.DLL functions that were added into the Win98 OSR and
// Windows 2000 but we're not included in the original implementation of
// HID.DLL in Windows 98. By getting pointers to these functions instead of
// statically linking with them, we can avoid the link error that would
// occur when this runs on Windows 98. The typedefs to make this easier to
// declare are also included below.
//
PGETEXTATTRIB pfnHidP_GetExtendedAttributes = NULL;
PINITREPORT pfnHidP_InitializeReportForID = NULL;
//****************************************************************************
// Global module variables
//****************************************************************************
static HINSTANCE hGInstance; //global application instance handle
static HANDLE HIDDLLModuleHandle;
//
// Variables for handling the two different types of devices that can be loaded
// into the system. PhysicalDeviceList contains all the actual HID devices
// attached via the USB bus.
//
static LIST PhysicalDeviceList;
//****************************************************************************
// Local data routine declarations
//****************************************************************************
VOID
vReadDataFromControls(
HWND hDlg,
prWriteDataStruct prData,
int iOffset,
int iCount
);
INT_PTR CALLBACK
bGetDataDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
);
INT_PTR CALLBACK
bMainDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
);
INT_PTR CALLBACK
bFeatureDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
);
INT_PTR CALLBACK
bReadDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
);
VOID
vLoadItemTypes(
HWND hItemTypes
);
BOOL
bGetData(
prWriteDataStruct,
int iCount,
HWND hParent,
char *pszDialogName
);
VOID
vLoadDevices(
HWND hDeviceCombo
);
VOID
vFreeDeviceList(
PHID_DEVICE DeviceList,
ULONG nDevices
);
VOID
vDisplayInputButtons(
PHID_DEVICE pDevice,
HWND hControl
);
VOID
vDisplayInputValues(
PHID_DEVICE pDevice,
HWND hControl
);
VOID
vDisplayOutputButtons(
PHID_DEVICE pDevice,
HWND hControl
);
VOID
vDisplayOutputValues(
PHID_DEVICE pDevice,
HWND hControl
);
VOID
vDisplayFeatureButtons(
PHID_DEVICE pDevice,
HWND hControl
);
VOID
vDisplayFeatureValues(
PHID_DEVICE pDevice,
HWND hControl
);
VOID
vWriteDataToControls(
HWND hDlg,
prWriteDataStruct prData,
int iOffset,
int iCount
);
int
iPrepareDataFields(
PHID_DATA pData,
ULONG ulDataLength,
rWriteDataStruct rWriteData[],
int iMaxElements
);
BOOL
bParseData(
PHID_DATA pData,
rWriteDataStruct rWriteData[],
INT iCount,
INT *piErrorLine
);
BOOL
bSetButtonUsages(
PHID_DATA pCap,
PCHAR pszInputString
);
VOID
BuildReportIDList(
IN PHIDP_BUTTON_CAPS phidButtonCaps,
IN USHORT nButtonCaps,
IN PHIDP_VALUE_CAPS phidValueCaps,
IN USHORT nValueCaps,
OUT UCHAR **ppReportIDList,
OUT INT *nReportIDs
);
VOID
ReportToString(
PHID_DATA pData,
PCHAR szBuff,
UINT iBuffSize
);
BOOL
RegisterHidDevice(
IN HWND WindowHandle,
IN PDEVICE_LIST_NODE DeviceNode
);
VOID
DestroyDeviceListCallback(
IN PLIST_NODE_HDR ListNode
);
//****************************************************************************
// Function Definitions
//****************************************************************************
/*******************************
*WinMain: Windows Entry point *
*******************************/
int PASCAL
WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//
// Save instance of the application for further reference
//
hGInstance = hInstance;
//
// Attempt to load HID.DLL...This should already be loaded due to the
// static linking of HID.DLL to this app on compilation. However,
// to insure that this application runs on Windows 98 gold, we cannot
// directly reference the new functions HidP_GetExtendedAttributes and
// HidP_InitializeReportForID so to use them, we'll get pointers to their
// functions instead.
//
HIDDLLModuleHandle = LoadLibrary("HID.DLL");
if (NULL == HIDDLLModuleHandle)
{
//
// Something really bad happened here...Throw up and error dialog
// and bolt.
//
MessageBox(NULL,
"Unable to open HID.DLL\n"
"This should never occur",
HCLIENT_ERROR,
MB_ICONSTOP);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -