From 6c474c19d970bf1588809c46ae6b5d7133da6bc6 Mon Sep 17 00:00:00 2001 From: Kazuhiro Fujieda Date: Sat, 24 Sep 2011 23:51:10 +0900 Subject: [PATCH] Start the 32bit process if the 64bit process previously starts. Simplify code to start the 64bit process in the 32bit process. --- xkeymacs/mainfrm.cpp | 2 +- xkeymacs/xkeymacs.cpp | 17 +++++++---------- xkeymacs/xkeymacs.h | 2 +- xkeymacs/xkeymacs64.cpp | 40 +++++++++++++++++++++++++++++++--------- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/xkeymacs/mainfrm.cpp b/xkeymacs/mainfrm.cpp index 942929a..2db3c69 100644 --- a/xkeymacs/mainfrm.cpp +++ b/xkeymacs/mainfrm.cpp @@ -575,7 +575,7 @@ void CMainFrame::OnReset() StartPollThread(); CXkeymacsApp *pApp = static_cast(AfxGetApp()); if (!pApp->SendIPCMessage(XKEYMACS_RESET)) - pApp->Create64bitProcess(); // try to restart 64bit app + pApp->Start64bitProcess(); // try to restart 64bit app } void CMainFrame::OnHelpFinder() diff --git a/xkeymacs/xkeymacs.cpp b/xkeymacs/xkeymacs.cpp index 555226f..4505008 100644 --- a/xkeymacs/xkeymacs.cpp +++ b/xkeymacs/xkeymacs.cpp @@ -75,7 +75,7 @@ BOOL CXkeymacsApp::InitInstance() // set registry key CUtils::InitCUtils(); - if (!Create64bitProcess()) + if (!Start64bitProcess()) return FALSE; CProfile::InitDllData(); @@ -87,7 +87,7 @@ BOOL CXkeymacsApp::IsWow64() return m_bIsWow64; } -BOOL CXkeymacsApp::Create64bitProcess() +BOOL CXkeymacsApp::Start64bitProcess() { typedef BOOL (WINAPI *PFIsWow64Process)(HANDLE, PBOOL); PFIsWow64Process func = (PFIsWow64Process)GetProcAddress(GetModuleHandle(_T("kernel32")), _T("IsWow64Process")); @@ -98,21 +98,18 @@ BOOL CXkeymacsApp::Create64bitProcess() if (!m_bIsWow64) return TRUE; // do nothing - TCHAR szFileName[MAX_PATH]; - if (!GetModuleFileName(NULL, szFileName, sizeof(szFileName))) + TCHAR buf[MAX_PATH]; + if (!GetModuleFileName(NULL, buf, MAX_PATH)) return FALSE; - TCHAR szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFile[_MAX_FNAME], szExt[_MAX_EXT]; - if (_tsplitpath_s(szFileName, szDrive, szDir, szFile, szExt) || - _tcscat_s(szFile, _T("64")) || - _tmakepath_s(szFileName, szDrive, szDir, szFile, szExt)) + CString path = buf; + if (!path.Replace(_T("xkeymacs.exe"), _T("xkeymacs64.exe"))) return FALSE; - STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); - if (!CreateProcess(szFileName, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + if (!CreateProcess(path, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return FALSE; // close unused handles CloseHandle(pi.hProcess); diff --git a/xkeymacs/xkeymacs.h b/xkeymacs/xkeymacs.h index fa9433d..0a98aed 100644 --- a/xkeymacs/xkeymacs.h +++ b/xkeymacs/xkeymacs.h @@ -39,7 +39,7 @@ public: //}}AFX_MSG BOOL IsWow64(); BOOL SendIPCMessage(DWORD msg); - BOOL Create64bitProcess(); + BOOL Start64bitProcess(); DECLARE_MESSAGE_MAP() private: HANDLE m_hMutex; diff --git a/xkeymacs/xkeymacs64.cpp b/xkeymacs/xkeymacs64.cpp index 2c4c505..6565aa0 100644 --- a/xkeymacs/xkeymacs64.cpp +++ b/xkeymacs/xkeymacs64.cpp @@ -10,21 +10,21 @@ CXkeymacsApp::CXkeymacsApp() CXkeymacsApp theApp; static UINT PollIPCMessage(LPVOID lpParam); +static void Start32bitProcess(); BOOL CXkeymacsApp::InitInstance() { - HANDLE h32 = CreateMutex(FALSE, 0, _T("XKeymacs")); - if (GetLastError() != ERROR_ALREADY_EXISTS) { - CloseHandle(h32); + m_hMutex = CreateMutex(NULL, FALSE, _T("XKeymacs64")); + if (GetLastError() == ERROR_ALREADY_EXISTS) { + CloseHandle(m_hMutex); + m_hMutex = NULL; return FALSE; } + bool start32bit = false; + HANDLE h32 = CreateMutex(NULL, FALSE, _T("XKeymacs")); + if (GetLastError() != ERROR_ALREADY_EXISTS) + start32bit = true; CloseHandle(h32); - m_hMutex = CreateMutex(FALSE, 0, _T("XKeymacs64")); - if (GetLastError() == ERROR_ALREADY_EXISTS) { - CloseHandle(m_hMutex); - m_hMutex = NULL; - return FALSE; - } m_pMainWnd = new CMainFrame; m_pMainWnd->ShowWindow(SW_HIDE); @@ -32,6 +32,8 @@ BOOL CXkeymacsApp::InitInstance() CUtils::InitCUtils(); AfxBeginThread(PollIPCMessage, NULL); + if (start32bit) + Start32bitProcess(); CXkeymacsDll::SetHooks(); return TRUE; } @@ -72,6 +74,26 @@ exit: return 0; } +void Start32bitProcess() +{ + TCHAR buf[MAX_PATH]; + if (!GetModuleFileName(NULL, buf, MAX_PATH)) + return; + CString path = buf; + if (!path.Replace(_T("xkeymacs64.exe"), _T("xkeymacs.exe"))) + return; + STARTUPINFO si; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + PROCESS_INFORMATION pi; + ZeroMemory(&pi, sizeof(pi)); + if (!CreateProcess(path, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + return; + // close unused handles + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); +} + int CXkeymacsApp::ExitInstance() { if (m_hMutex) { -- 2.11.0