windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/diconfig/dconfig.cpp
2020-09-26 16:20:57 +08:00

192 lines
5 KiB
C++

#include "framecommon.h"
////////////
// Globals
//
const TCHAR g_tszMutexName[] = _T("DIActionConfigFrameworkPreventSecondInstance");
const CHAR g_szAppName[] = "DCONFIG"; // application name
HANDLE g_hMutex = NULL; // prevent second instance mutex
HINSTANCE g_hInst = NULL; // global instance handle
HWND g_hwndMain = NULL; // handle to the main window
LPDIACTIONFORMATW lpDiActFormMaster = NULL; //master copy of the DIACTIONFORMAT
DIACTIONFORMATW diActForLocal; //local copy of DIACTIONFORMAT
LPCWSTR lpUserName = NULL; //user name
// {FD4ACE13-7044-4204-8B15-095286B12EAD}
static const GUID GUID_DIConfigAppEditLayout =
{ 0xfd4ace13, 0x7044, 0x4204, { 0x8b, 0x15, 0x9, 0x52, 0x86, 0xb1, 0x2e, 0xad } };
/////////////////
// Functions...
//
//////////////////////////////////////////
// Actually runs the DConfig dialog app.
// retures EXIT_FAILURE or EXIT_SUCCESS.
//
int RunDConfig(HINSTANCE hInstance, HWND hWnd, LPVOID lpDDSurf, LPDICONFIGUREDEVICESCALLBACK pCallback, DWORD dwFlags)
{
// quit (with errmsg) if we're not at least 256 colors / 8 bit
HDC hMemDC = CreateCompatibleDC(NULL);
int bpp = GetDeviceCaps(hMemDC, BITSPIXEL);
DeleteDC(hMemDC);
if (bpp < 8)
{
ErrorBox(IDS_ERROR_COLORS);
return EXIT_FAILURE;
}
// set global instance handle
g_hInst = hInstance;
// create and run the configuration window
GUID check = lpDiActFormMaster ? lpDiActFormMaster->guidApplication : diActForLocal.guidApplication;
BOOL bEditLayout = IsEqualGUID(check, GUID_DIConfigAppEditLayout);
CFlexWnd::RegisterWndClass(hInstance);
CConfigWnd cfgWnd(lpDDSurf, pCallback, bEditLayout, dwFlags);
BOOL bSuccess = cfgWnd.Create(hWnd);
if (bSuccess)
{
g_hwndMain = cfgWnd.m_hWnd;
// enter message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CFlexWnd::UnregisterWndClass(hInstance);
return bSuccess ? EXIT_SUCCESS : EXIT_FAILURE;
}
///////////////////////////////////////////
// Allocates and loads a resource string.
// Returns it or NULL if unsuccessful.
//
TCHAR *AllocLoadString(UINT strid)
{
// allocate
const int STRING_LENGTHS = 1024;
TCHAR *str = (TCHAR *)malloc(STRING_LENGTHS * sizeof(TCHAR));
// use if allocated succesfully
if (str != NULL)
{
// load the string, or free and null if we can't
if (LoadString(g_hInst, strid, str, STRING_LENGTHS) == NULL)
{
free(str);
str = NULL;
}
}
return str;
}
void ErrorBox(UINT strid, HRESULT hr)
{
LPCTSTR s;
switch (hr)
{
case DIERR_BETADIRECTINPUTVERSION: s = _T("DIERR_BETADIRECTINPUTVERSION"); break;
case DIERR_INVALIDPARAM: s = _T("DIERR_INVALIDPARAM"); break;
case DIERR_OLDDIRECTINPUTVERSION: s = _T("DIERR_OLDDIRECTINPUTVERSION"); break;
case DIERR_OUTOFMEMORY: s = _T("DIERR_OUTOFMEMORY"); break;
}
ErrorBox(strid, s);
}
/////////////////////////////////////////////////////////
// Shows a message box with the specified error string.
// (automatically handles getting and freeing string.)
//
void ErrorBox(UINT strid, LPCTSTR postmsg)
{
// alloc 'n load
TCHAR *errmsg = AllocLoadString(strid);
TCHAR *errdlgtitle = AllocLoadString(IDS_ERROR_DLG_TITLE);
// put english dummy error text for strings that couldn't load
if (NULL == errmsg)
errmsg = _tcsdup(_T("Error! (unspecified: could not load error string!)"));
if (NULL == errdlgtitle)
errdlgtitle = _tcsdup(_T("Error! (could not load error box title string!)"));
// append post message if provided
if (postmsg != NULL)
{
TCHAR catstr[] = _T("\n\n");
int len = _tcslen(errmsg) + _tcslen(catstr) + _tcslen(postmsg);
TCHAR *fullmsg = (TCHAR *)malloc(len * sizeof(TCHAR));
if (fullmsg != NULL)
{
_tcscpy(fullmsg, errmsg);
_tcscat(fullmsg, catstr);
_tcscat(fullmsg, postmsg);
free(errmsg);
errmsg = fullmsg;
}
}
// Show error
MessageBox(g_hwndMain, errmsg, errdlgtitle, MB_OK | MB_ICONSTOP);
// free which ever strings loaded
if (NULL != errmsg)
free(errmsg);
if (NULL != errdlgtitle)
free(errdlgtitle);
}
/////////////////////////////////////////////////////////
// Shows a message box based on GetLastError().
//
void LastErrorBox()
{
DWORD lasterr = GetLastError();
LPVOID lpMsgBuf = NULL;
TCHAR *errdlgtitle = AllocLoadString(IDS_ERROR_DLG_TITLE);
// format an error message from GetLastError().
DWORD result = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lasterr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL);
// put english dummy error text for dlg title if it couldn't load
if (NULL == errdlgtitle)
errdlgtitle = _tcsdup(_T("Error! (could not load error box title string!)"));
// if format message fails, show an error box without string id
if (0 == result)
ErrorBox(NULL);
else // otherwise, show the message we just formatted
{
assert(lpMsgBuf != NULL);
MessageBox(g_hwndMain, (LPCTSTR)lpMsgBuf, errdlgtitle, MB_OK | MB_ICONINFORMATION);
}
// free whichever strings were allocated
if (NULL != lpMsgBuf)
LocalFree(lpMsgBuf);
if (NULL != errdlgtitle)
free(errdlgtitle);
}