OSDN Git Service

Start the 32bit process if the 64bit process previously starts.
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sat, 24 Sep 2011 14:51:10 +0000 (23:51 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sat, 24 Sep 2011 14:51:10 +0000 (23:51 +0900)
Simplify code to start the 64bit process in the 32bit process.

xkeymacs/mainfrm.cpp
xkeymacs/xkeymacs.cpp
xkeymacs/xkeymacs.h
xkeymacs/xkeymacs64.cpp

index 942929a..2db3c69 100644 (file)
@@ -575,7 +575,7 @@ void CMainFrame::OnReset()
        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
index 555226f..4505008 100644 (file)
@@ -75,7 +75,7 @@ BOOL CXkeymacsApp::InitInstance()
 \r
        // set registry key\r
        CUtils::InitCUtils();\r
-       if (!Create64bitProcess())\r
+       if (!Start64bitProcess())\r
                return FALSE;\r
        CProfile::InitDllData();\r
 \r
@@ -87,7 +87,7 @@ BOOL CXkeymacsApp::IsWow64()
        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
@@ -98,21 +98,18 @@ BOOL CXkeymacsApp::Create64bitProcess()
        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
index fa9433d..0a98aed 100644 (file)
@@ -39,7 +39,7 @@ public:
        //}}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
index 2c4c505..6565aa0 100644 (file)
@@ -10,21 +10,21 @@ CXkeymacsApp::CXkeymacsApp()
 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
@@ -32,6 +32,8 @@ BOOL CXkeymacsApp::InitInstance()
 \r
        CUtils::InitCUtils();\r
        AfxBeginThread(PollIPCMessage, NULL);\r
+       if (start32bit)\r
+               Start32bitProcess();\r
        CXkeymacsDll::SetHooks();\r
        return TRUE;\r
 }\r
@@ -72,6 +74,26 @@ exit:
        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