2012-12-24 10:20:23 -05:00
|
|
|
// dxwndhost.cpp : Application and class definitions
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "dxwndhost.h"
|
|
|
|
|
|
|
|
#include "MainFrm.h"
|
|
|
|
#include "dxwndhostDoc.h"
|
|
|
|
#include "dxwndhostView.h"
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
#undef THIS_FILE
|
|
|
|
static char THIS_FILE[] = __FILE__;
|
|
|
|
#endif
|
|
|
|
|
2017-02-05 11:50:05 -05:00
|
|
|
extern int KillProcByName(char *, BOOL, BOOL);
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CDxwndhostApp
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CDxwndhostApp, CWinApp)
|
|
|
|
//{{AFX_MSG_MAP(CDxwndhostApp)
|
|
|
|
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
|
2016-06-26 12:46:13 -04:00
|
|
|
ON_COMMAND(ID_HELP_VIEWHELP, OnViewHelp)
|
2012-12-24 10:20:23 -05:00
|
|
|
//}}AFX_MSG_MAP
|
|
|
|
// Basic file command
|
|
|
|
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
|
|
|
|
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// custom command line parsing:
|
|
|
|
// CNewCommandLineInfo Class constructor
|
|
|
|
|
|
|
|
// too do: eliminate nasty global variables....
|
|
|
|
UINT m_StartToTray = FALSE;
|
|
|
|
UINT m_InitialState = DXW_ACTIVE;
|
2013-07-21 12:38:09 -04:00
|
|
|
BOOL gbDebug = FALSE;
|
2016-11-18 11:48:16 -05:00
|
|
|
BOOL gWarnOnExit = FALSE;
|
2016-04-03 12:42:48 -04:00
|
|
|
BOOL gTransientMode = FALSE;
|
2016-12-04 11:45:35 -05:00
|
|
|
BOOL gAutoHideMode = FALSE;
|
2016-10-16 12:47:44 -04:00
|
|
|
BOOL gQuietMode = FALSE;
|
2016-07-12 12:48:29 -04:00
|
|
|
BOOL gMustDie = FALSE;
|
2016-04-03 12:42:48 -04:00
|
|
|
int iProgIndex;
|
2017-02-15 11:50:18 -05:00
|
|
|
DWORD SysColors[32];
|
2017-03-25 10:00:24 -04:00
|
|
|
//char m_ConfigFileName[MAX_PATH+1] = "dxwnd.ini";
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
class CNewCommandLineInfo : public CCommandLineInfo
|
|
|
|
{
|
|
|
|
//public:
|
|
|
|
// UINT m_StartToTray;
|
|
|
|
// UINT m_InitialState;
|
|
|
|
|
|
|
|
void ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast);
|
|
|
|
};
|
|
|
|
|
2014-02-07 11:39:27 -05:00
|
|
|
BOOL LangSelected=FALSE;
|
|
|
|
char LangString[20+1] = {0};
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
|
|
|
|
{
|
2016-04-03 12:42:48 -04:00
|
|
|
// syntax:
|
|
|
|
// /t -- start minimized in tray icon
|
|
|
|
// /i -- start in idle state
|
|
|
|
// /d -- start in debug mode
|
|
|
|
// /lang=<XX> -- loads the language resources in Resources_<XX>.dll extension
|
|
|
|
// /c:<path> -- loads <path> config file instead of default dxwnd.ini
|
|
|
|
// /e -- terminates (Ends) the active dxwnd session
|
2016-12-04 11:45:35 -05:00
|
|
|
// /r:<n> -- run the n-th game in configuration and terminate together with it
|
|
|
|
// /a -- auto-hide mode while a game is running
|
2016-06-11 12:48:04 -04:00
|
|
|
// /q -- quiet mode, no error/message dialog boxes
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
if(bFlag) {
|
|
|
|
CString sParam(lpszParam);
|
|
|
|
if (sParam.MakeLower() == "t"){
|
|
|
|
m_StartToTray=TRUE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (sParam.MakeLower() == "i"){
|
|
|
|
m_InitialState=DXW_IDLE;
|
|
|
|
return;
|
|
|
|
}
|
2016-12-04 11:45:35 -05:00
|
|
|
if (sParam.MakeLower() == "a"){
|
|
|
|
gAutoHideMode=TRUE;
|
|
|
|
return;
|
|
|
|
}
|
2013-07-21 12:38:09 -04:00
|
|
|
if (sParam.MakeLower() == "debug"){
|
|
|
|
gbDebug = TRUE;
|
|
|
|
return;
|
|
|
|
}
|
2014-06-22 12:39:24 -04:00
|
|
|
if (sParam.MakeLower().Left(5) == "lang="){
|
|
|
|
HMODULE ResLib;
|
|
|
|
CString Lang;
|
|
|
|
Lang = sParam.MakeLower().Right(2);
|
|
|
|
ResLib=LoadLibrary("Resources_"+Lang+".dll");
|
2014-02-07 11:39:27 -05:00
|
|
|
if(ResLib) {
|
|
|
|
AfxSetResourceHandle(ResLib);
|
|
|
|
LangSelected=TRUE;
|
|
|
|
}
|
2014-06-22 12:39:24 -04:00
|
|
|
else MessageBoxEx(NULL, "Missing language \""+Lang+"\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
|
2014-02-07 11:39:27 -05:00
|
|
|
//strcpy(LangString, sParam.MakeLower().Mid(5));
|
2014-06-22 12:39:24 -04:00
|
|
|
return;
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
if (sParam.Left(2).MakeLower() == "c:"){
|
2017-03-25 10:00:24 -04:00
|
|
|
strcpy_s(gInitPath, sizeof(gInitPath)-1, sParam.Mid(2,sizeof(gInitPath)-1));
|
2012-12-24 10:20:23 -05:00
|
|
|
return;
|
|
|
|
}
|
2015-11-19 11:42:28 -05:00
|
|
|
if (sParam.MakeLower() == "e"){
|
|
|
|
// Exit (kill) existing DxWnd session
|
2017-02-05 11:50:05 -05:00
|
|
|
KillProcByName("DxWnd.exe", TRUE, FALSE);
|
2015-11-19 11:42:28 -05:00
|
|
|
exit(0);
|
|
|
|
}
|
2016-04-03 12:42:48 -04:00
|
|
|
if (sParam.Left(2).MakeLower() == "r:"){
|
|
|
|
gTransientMode = TRUE;
|
|
|
|
m_StartToTray=TRUE;
|
|
|
|
char *p = (char *)sParam.GetString();
|
|
|
|
iProgIndex = atoi(&p[2]);
|
|
|
|
return;
|
|
|
|
}
|
2016-10-16 12:47:44 -04:00
|
|
|
if (sParam.MakeLower() == "q"){
|
|
|
|
// (Q)uiet mode: no message dialogs on screen
|
|
|
|
gQuietMode = TRUE;
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Call the base class to ensure proper command line processing
|
|
|
|
CCommandLineInfo::ParseParam(lpszParam, bFlag, bLast);
|
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CDxwndhostApp Class constructor
|
|
|
|
|
|
|
|
CDxwndhostApp::CDxwndhostApp()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// The only CDxwndhostApp object
|
|
|
|
|
|
|
|
CDxwndhostApp theApp;
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CDxwndhostApp Class initialization
|
|
|
|
|
|
|
|
BOOL CDxwndhostApp::InitInstance()
|
|
|
|
{
|
2014-07-28 12:39:37 -04:00
|
|
|
char InitPath[MAX_PATH];
|
2012-12-24 10:20:23 -05:00
|
|
|
AfxEnableControlContainer();
|
|
|
|
|
|
|
|
// standard initialization
|
|
|
|
|
|
|
|
// DDE file open: Parse command line for standard shell commands and so on.
|
|
|
|
// Parse command line for standard shell commands, DDE, file open
|
|
|
|
// and user-defined flags. The CCommandLine class has been replaced
|
|
|
|
CNewCommandLineInfo cmdInfo;
|
|
|
|
ParseCommandLine(cmdInfo);
|
2014-07-28 12:39:37 -04:00
|
|
|
|
|
|
|
GetCurrentDirectory(MAX_PATH, InitPath);
|
|
|
|
strcat_s(InitPath, sizeof(InitPath), "\\dxwnd.ini");
|
|
|
|
|
|
|
|
//CompatibilityMinLevel = GetPrivateProfileInt("window", "compatminlevel", 0, InitPath);
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2015-01-24 11:40:16 -05:00
|
|
|
if(!gbDebug) gbDebug = GetPrivateProfileInt("window", "debug", 0, InitPath); // debug flag set from config file
|
2016-12-04 11:45:35 -05:00
|
|
|
if(!gAutoHideMode) gAutoHideMode = GetPrivateProfileInt("window", "autohide", 0, InitPath); // debug flag set from config file
|
2016-11-18 11:48:16 -05:00
|
|
|
gWarnOnExit = GetPrivateProfileInt("window", "warnonexit", 0, InitPath); // WarnOnExit flag set from config file
|
2014-09-13 12:39:44 -04:00
|
|
|
|
2017-01-17 11:49:27 -05:00
|
|
|
// Register the document template.
|
|
|
|
|
|
|
|
CSingleDocTemplate* pDocTemplate;
|
|
|
|
pDocTemplate = new CSingleDocTemplate(
|
|
|
|
gbDebug ? IDR_MAINFRAME_EX : IDR_MAINFRAME,
|
|
|
|
RUNTIME_CLASS(CDxwndhostDoc),
|
|
|
|
RUNTIME_CLASS(CMainFrame), // SDI main frame window
|
|
|
|
RUNTIME_CLASS(CDxwndhostView));
|
|
|
|
AddDocTemplate(pDocTemplate);
|
|
|
|
|
2014-02-07 11:39:27 -05:00
|
|
|
if(!LangSelected){
|
|
|
|
LANGID LangId;
|
|
|
|
char LangString[20+1];
|
|
|
|
GetPrivateProfileString("window", "lang", "", LangString, 20+1, InitPath);
|
|
|
|
if(!strcmp(LangString, "default") || !strlen(LangString)){ // if no specification, or lang=default
|
|
|
|
// do nothing
|
|
|
|
}
|
|
|
|
if(!strcmp(LangString, "automatic")){ // lang=automatic
|
|
|
|
HMODULE ResLib;
|
|
|
|
LangId=GetUserDefaultUILanguage();
|
|
|
|
// other codes to be implemented:
|
|
|
|
// 409 (2-9): english (default)
|
|
|
|
// 411 (2-11): japanese
|
|
|
|
switch(LangId & 0x1FF){
|
|
|
|
case 0x04: // chinese family
|
|
|
|
ResLib=LoadLibrary("Resources_CN.dll");
|
|
|
|
if(ResLib) AfxSetResourceHandle(ResLib);
|
|
|
|
else MessageBoxEx(NULL, "Missing language \"CN\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
|
|
|
|
break;
|
|
|
|
case 0x10: // 410 - italian, 810 - switzerland italian
|
|
|
|
ResLib=LoadLibrary("Resources_IT.dll");
|
|
|
|
if(ResLib) AfxSetResourceHandle(ResLib);
|
2014-10-07 12:39:31 -04:00
|
|
|
else MessageBoxEx(NULL, "Missing language \"IT\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
|
2014-11-15 11:39:58 -05:00
|
|
|
break;
|
|
|
|
case 0x19: // 419 - russian
|
|
|
|
ResLib=LoadLibrary("Resources_RU.dll");
|
|
|
|
if(ResLib) AfxSetResourceHandle(ResLib);
|
|
|
|
else MessageBoxEx(NULL, "Missing language \"RU\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
|
2014-02-07 11:39:27 -05:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
//char sBuf[81];
|
|
|
|
//sprintf(sBuf, "Got Lang=%x(%x-%x)", LangId, LangId>>9, (LangId & 0x1FF));
|
|
|
|
//MessageBox(NULL, sBuf, "LangId", MB_OK);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(strcmp(LangString, "automatic") && strcmp(LangString, "default") && strlen(LangString)) { // lang=something different from both automatic and default
|
|
|
|
HMODULE ResLib;
|
|
|
|
CString Lang;
|
|
|
|
Lang.SetString(LangString);
|
|
|
|
ResLib=LoadLibrary("Resources_"+Lang+".dll");
|
|
|
|
if(ResLib) AfxSetResourceHandle(ResLib);
|
|
|
|
else MessageBoxEx(NULL, "Missing language \""+Lang+"\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
// Dispatch commands specified on the command line.
|
|
|
|
if (!ProcessShellCommand(cmdInfo))
|
|
|
|
return FALSE;
|
|
|
|
m_pMainWnd->SetWindowText("DXWnd");
|
|
|
|
RECT rect;
|
|
|
|
m_pMainWnd->GetWindowRect(&rect);
|
|
|
|
rect.right = rect.left + 320;
|
|
|
|
rect.bottom = rect.top + 200;
|
|
|
|
//m_pMainWnd->MoveWindow(&rect, TRUE);
|
|
|
|
m_pMainWnd->ShowWindow(SW_SHOW);
|
|
|
|
m_pMainWnd->UpdateWindow();
|
|
|
|
|
2015-01-24 11:40:16 -05:00
|
|
|
BOOL bCheckAdminRights = GetPrivateProfileInt("window", "checkadmin", 0, InitPath);
|
2016-04-17 12:45:41 -04:00
|
|
|
extern BOOL DxSelfElevate(CDxwndhostView *);
|
2014-04-13 12:39:06 -04:00
|
|
|
OSVERSIONINFO osver = { sizeof(osver) };
|
2016-12-03 11:45:15 -05:00
|
|
|
// self elevation at start if configured for the whole DxWnd session
|
2015-01-24 11:40:16 -05:00
|
|
|
if (bCheckAdminRights && (GetVersionEx(&osver)) && (osver.dwMajorVersion >= 6)){
|
2016-04-17 12:45:41 -04:00
|
|
|
DxSelfElevate((CDxwndhostView *)NULL);
|
2014-04-13 12:39:06 -04:00
|
|
|
}
|
2017-02-15 11:50:18 -05:00
|
|
|
|
|
|
|
// save system colors for later recovery
|
|
|
|
for(int index=COLOR_SCROLLBAR; index<=COLOR_MENUBAR; index++) SysColors[index]=0; // initialize
|
|
|
|
for(int index=COLOR_SCROLLBAR; index<=COLOR_MENUBAR; index++) SysColors[index]=::GetSysColor(index);
|
|
|
|
return TRUE;
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Used in application version information dialog CAboutDlg
|
|
|
|
|
|
|
|
class CAboutDlg : public CDialog
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CAboutDlg();
|
2017-02-15 11:50:18 -05:00
|
|
|
virtual BOOL OnInitDialog();
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
// Data Dialog
|
|
|
|
//{{AFX_DATA(CAboutDlg)
|
|
|
|
enum { IDD = IDD_ABOUTBOX };
|
|
|
|
CString m_Version;
|
2017-02-15 11:50:18 -05:00
|
|
|
CString m_Thanks;
|
2012-12-24 10:20:23 -05:00
|
|
|
//}}AFX_DATA
|
|
|
|
|
|
|
|
// ClassWizard generated virtual function overrides.
|
|
|
|
//{{AFX_VIRTUAL(CAboutDlg)
|
|
|
|
protected:
|
|
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Support
|
2017-02-15 11:50:18 -05:00
|
|
|
virtual void OnTimer(UINT_PTR);
|
2012-12-24 10:20:23 -05:00
|
|
|
//}}AFX_VIRTUAL
|
|
|
|
|
|
|
|
// Implementation
|
|
|
|
protected:
|
|
|
|
//{{AFX_MSG(CAboutDlg)
|
|
|
|
// There is no message handler.
|
|
|
|
//}}AFX_MSG
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
};
|
|
|
|
|
|
|
|
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
|
|
|
|
{
|
|
|
|
//{{AFX_DATA_INIT(CAboutDlg)
|
|
|
|
m_Version = _T("");
|
|
|
|
//}}AFX_DATA_INIT
|
|
|
|
}
|
|
|
|
|
|
|
|
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
|
|
|
{
|
|
|
|
CDialog::DoDataExchange(pDX);
|
|
|
|
//{{AFX_DATA_MAP(CAboutDlg)
|
|
|
|
DDX_Text(pDX, IDC_VERSION, m_Version);
|
2017-02-15 11:50:18 -05:00
|
|
|
DDX_Text(pDX, IDC_THANKS, m_Thanks);
|
2012-12-24 10:20:23 -05:00
|
|
|
//}}AFX_DATA_MAP
|
|
|
|
}
|
|
|
|
|
2017-02-15 11:50:18 -05:00
|
|
|
#define ID_HELP_SCROLL 999
|
|
|
|
|
|
|
|
BOOL CAboutDlg::OnInitDialog()
|
|
|
|
{
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
SetTimer(ID_HELP_SCROLL, 600, NULL);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
|
|
}
|
|
|
|
|
|
|
|
CString Thanks[] = {
|
|
|
|
"Aqrit for proxies, many tweaks & hot patching schema",
|
|
|
|
"AxXxB and Old-Games.ru teammates for ZBUFFER fix",
|
|
|
|
"Fabian \"ryg\" Giesen & others for DXT1/5 compression",
|
|
|
|
"FunkyFr3sh for fixes in proxy dll",
|
|
|
|
"Gsky916 for chinese translation",
|
|
|
|
"Jari Kommpa for ddraw wrapper source and d3d hints",
|
|
|
|
"Jiri Dvorak for his d3d8 wrapper with 16bpp emulation",
|
|
|
|
"Luigi Auriemma for injection syncronization",
|
|
|
|
"Michael Koch for d3d9 proxy dll",
|
|
|
|
"Narzoul for sharing DC handling code",
|
|
|
|
"Olly (www.ollydbg.de) for OllyDBG & disasm lib",
|
|
|
|
"RomSteady for his kind encouragement",
|
|
|
|
"Ryan Geiss for his bilinear filter code",
|
|
|
|
"TigerhawkT3 for html manual pages",
|
|
|
|
"Tsuda Kageyu for MinHook dll",
|
|
|
|
""};
|
|
|
|
|
|
|
|
#define THANKSKOUNT 15
|
|
|
|
|
|
|
|
void CAboutDlg::OnTimer(UINT_PTR nIDEvent)
|
|
|
|
{
|
|
|
|
static int i=0;
|
|
|
|
int j;
|
|
|
|
CString RolledThanks;
|
|
|
|
for(j=i; j<THANKSKOUNT; j++) RolledThanks.AppendFormat("%s\n", Thanks[j]);
|
|
|
|
for(j=0; j<i ; j++) RolledThanks.AppendFormat("%s\n", Thanks[j]);
|
|
|
|
this->SetDlgItemTextA(IDC_THANKS, RolledThanks);
|
|
|
|
i=(i+1)%THANKSKOUNT;
|
|
|
|
}
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
|
2017-02-15 11:50:18 -05:00
|
|
|
ON_WM_TIMER()
|
2012-12-24 10:20:23 -05:00
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
// The application command to run the dialog
|
|
|
|
void CDxwndhostApp::OnAppAbout()
|
|
|
|
{
|
|
|
|
char tmp[32], ver[32];
|
|
|
|
CAboutDlg aboutDlg;
|
|
|
|
GetDllVersion(tmp);
|
|
|
|
sprintf(ver, "DLL version %s", tmp);
|
|
|
|
aboutDlg.m_Version = ver;
|
2017-02-15 11:50:18 -05:00
|
|
|
aboutDlg.m_Thanks = "";
|
|
|
|
// aboutDlg.m_Thanks = "\
|
|
|
|
//Aqrit for proxies, many tweaks & hot patching schema\n\
|
|
|
|
//AxXxB and Old-Games.ru teammates for ZBUFFER fix\n\
|
|
|
|
//Fabian \"ryg\" Giesen & others for DXT1/5 compression\n\
|
|
|
|
//FunkyFr3sh for fixes in proxy dll\n\
|
|
|
|
//Gsky916 for chinese translation\n\
|
|
|
|
//Jari Kommpa for ddraw wrapper source and d3d hints\n\
|
|
|
|
//Jiri Dvorak for his d3d8 wrapper with 16bpp emulation\n\
|
|
|
|
//Luigi Auriemma for injection syncronization\n\
|
|
|
|
//Michael Koch for d3d9 proxy dll\n\
|
|
|
|
//Narzoul for sharing DC handling code\n\
|
|
|
|
//Olly (www.ollydbg.de) for OllyDBG & disasm lib\n\
|
|
|
|
//RomSteady for his kind encouragement\n\
|
|
|
|
//Ryan Geiss for his bilinear filter code\n\
|
|
|
|
//TigerhawkT3 for html manual pages\n\
|
|
|
|
//Tsuda Kageyu for MinHook dll\n\
|
|
|
|
//";
|
2012-12-24 10:20:23 -05:00
|
|
|
aboutDlg.DoModal();
|
2017-02-15 11:50:18 -05:00
|
|
|
aboutDlg.KillTimer(ID_HELP_SCROLL);
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
|
2016-06-26 12:46:13 -04:00
|
|
|
void CDxwndhostApp::OnViewHelp()
|
|
|
|
{
|
|
|
|
HINSTANCE ret;
|
|
|
|
char sHelpPath[MAX_PATH];
|
2016-07-30 12:46:40 -04:00
|
|
|
GetPrivateProfileString("window", "help", ".\\help\\DxWnd.html", sHelpPath, MAX_PATH, gInitPath);
|
2016-06-26 12:46:13 -04:00
|
|
|
ret=ShellExecute(NULL, "open", sHelpPath, NULL, NULL, SW_SHOWNORMAL);
|
|
|
|
if((DWORD)ret<=32){
|
|
|
|
char *m;
|
|
|
|
switch((DWORD)ret){
|
|
|
|
case 0: m="Out of memory resources"; break;
|
|
|
|
case ERROR_BAD_FORMAT: m="Invalid .exe file"; break;
|
|
|
|
case SE_ERR_ACCESSDENIED: m="Access denied"; break;
|
|
|
|
case SE_ERR_ASSOCINCOMPLETE: m="File name association incomplete or invalid"; break;
|
|
|
|
case SE_ERR_DDEBUSY: m="DDE busy"; break;
|
|
|
|
case SE_ERR_DDEFAIL: m="DDE failed"; break;
|
|
|
|
case SE_ERR_DDETIMEOUT: m="DDE timed out"; break;
|
|
|
|
case SE_ERR_DLLNOTFOUND: m="DLL not found"; break;
|
|
|
|
case SE_ERR_FNF: m="File not found"; break;
|
|
|
|
case SE_ERR_NOASSOC: m="No association with file extension"; break;
|
|
|
|
case SE_ERR_OOM: m="Not enough memory"; break;
|
|
|
|
case SE_ERR_PNF: m="Path not found"; break;
|
|
|
|
case SE_ERR_SHARE: m="Sharing violation"; break;
|
|
|
|
default: m="Unknown error"; break;
|
|
|
|
}
|
|
|
|
MessageBox(0, m, "DxWnd error", MB_ICONEXCLAMATION|MB_OK);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CDxwndhostApp Message Handler
|
|
|
|
|
2013-01-22 11:17:01 -05:00
|
|
|
char *GetTSCaption(int shift)
|
|
|
|
{
|
|
|
|
static char *sTSCaption[17]={
|
|
|
|
"x16","x12","x8","x6",
|
|
|
|
"x4","x3","x2","x1.5",
|
|
|
|
"x1",
|
|
|
|
":1.5",":2",":3",":4",
|
|
|
|
":6",":8",":12",":16"};
|
|
|
|
if (shift<-8 || shift>8) return "???";
|
|
|
|
return sTSCaption[shift+8];
|
2013-12-22 11:38:36 -05:00
|
|
|
}
|