Simplify code to start the 64bit process in the 32bit process.
StartPollThread();\r
CXkeymacsApp *pApp = static_cast<CXkeymacsApp *>(AfxGetApp());\r
if (!pApp->SendIPCMessage(XKEYMACS_RESET))\r
- pApp->Create64bitProcess(); // try to restart 64bit app\r
+ pApp->Start64bitProcess(); // try to restart 64bit app\r
}\r
\r
void CMainFrame::OnHelpFinder() \r
\r
// set registry key\r
CUtils::InitCUtils();\r
- if (!Create64bitProcess())\r
+ if (!Start64bitProcess())\r
return FALSE;\r
CProfile::InitDllData();\r
\r
return m_bIsWow64;\r
}\r
\r
-BOOL CXkeymacsApp::Create64bitProcess()\r
+BOOL CXkeymacsApp::Start64bitProcess()\r
{\r
typedef BOOL (WINAPI *PFIsWow64Process)(HANDLE, PBOOL);\r
PFIsWow64Process func = (PFIsWow64Process)GetProcAddress(GetModuleHandle(_T("kernel32")), _T("IsWow64Process"));\r
if (!m_bIsWow64)\r
return TRUE; // do nothing\r
\r
- TCHAR szFileName[MAX_PATH];\r
- if (!GetModuleFileName(NULL, szFileName, sizeof(szFileName)))\r
+ TCHAR buf[MAX_PATH];\r
+ if (!GetModuleFileName(NULL, buf, MAX_PATH))\r
return FALSE;\r
- TCHAR szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFile[_MAX_FNAME], szExt[_MAX_EXT];\r
- if (_tsplitpath_s(szFileName, szDrive, szDir, szFile, szExt) ||\r
- _tcscat_s(szFile, _T("64")) ||\r
- _tmakepath_s(szFileName, szDrive, szDir, szFile, szExt))\r
+ CString path = buf;\r
+ if (!path.Replace(_T("xkeymacs.exe"), _T("xkeymacs64.exe")))\r
return FALSE;\r
-\r
STARTUPINFO si;\r
ZeroMemory(&si, sizeof(si));\r
si.cb = sizeof(si);\r
PROCESS_INFORMATION pi;\r
ZeroMemory(&pi, sizeof(pi));\r
- if (!CreateProcess(szFileName, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
+ if (!CreateProcess(path, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
return FALSE;\r
// close unused handles\r
CloseHandle(pi.hProcess);\r
//}}AFX_MSG\r
BOOL IsWow64();\r
BOOL SendIPCMessage(DWORD msg);\r
- BOOL Create64bitProcess();\r
+ BOOL Start64bitProcess();\r
DECLARE_MESSAGE_MAP()\r
private:\r
HANDLE m_hMutex;\r
CXkeymacsApp theApp;\r
\r
static UINT PollIPCMessage(LPVOID lpParam);\r
+static void Start32bitProcess();\r
\r
BOOL CXkeymacsApp::InitInstance()\r
{\r
- HANDLE h32 = CreateMutex(FALSE, 0, _T("XKeymacs"));\r
- if (GetLastError() != ERROR_ALREADY_EXISTS) {\r
- CloseHandle(h32);\r
+ m_hMutex = CreateMutex(NULL, FALSE, _T("XKeymacs64"));\r
+ if (GetLastError() == ERROR_ALREADY_EXISTS) {\r
+ CloseHandle(m_hMutex);\r
+ m_hMutex = NULL;\r
return FALSE;\r
}\r
+ bool start32bit = false;\r
+ HANDLE h32 = CreateMutex(NULL, FALSE, _T("XKeymacs"));\r
+ if (GetLastError() != ERROR_ALREADY_EXISTS)\r
+ start32bit = true;\r
CloseHandle(h32);\r
- m_hMutex = CreateMutex(FALSE, 0, _T("XKeymacs64"));\r
- if (GetLastError() == ERROR_ALREADY_EXISTS) {\r
- CloseHandle(m_hMutex);\r
- m_hMutex = NULL;\r
- return FALSE;\r
- }\r
\r
m_pMainWnd = new CMainFrame;\r
m_pMainWnd->ShowWindow(SW_HIDE);\r
\r
CUtils::InitCUtils();\r
AfxBeginThread(PollIPCMessage, NULL);\r
+ if (start32bit)\r
+ Start32bitProcess();\r
CXkeymacsDll::SetHooks();\r
return TRUE;\r
}\r
return 0;\r
}\r
\r
+void Start32bitProcess()\r
+{\r
+ TCHAR buf[MAX_PATH];\r
+ if (!GetModuleFileName(NULL, buf, MAX_PATH))\r
+ return;\r
+ CString path = buf;\r
+ if (!path.Replace(_T("xkeymacs64.exe"), _T("xkeymacs.exe")))\r
+ return;\r
+ STARTUPINFO si;\r
+ ZeroMemory(&si, sizeof(si));\r
+ si.cb = sizeof(si);\r
+ PROCESS_INFORMATION pi;\r
+ ZeroMemory(&pi, sizeof(pi));\r
+ if (!CreateProcess(path, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
+ return;\r
+ // close unused handles\r
+ CloseHandle(pi.hProcess);\r
+ CloseHandle(pi.hThread);\r
+}\r
+\r
int CXkeymacsApp::ExitInstance() \r
{\r
if (m_hMutex) {\r