#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); }