OSDN Git Service

Give main roles to 32bit version and simplify 64bit version.
[xkeymacs/xkeymacs.git] / xkeymacs / xkeymacs.cpp
index 47d9eb2..f4c04bd 100644 (file)
@@ -28,6 +28,7 @@ END_MESSAGE_MAP()
 CXkeymacsApp::CXkeymacsApp()\r
 {\r
        m_hMutex = NULL;\r
+       m_bIsWow64 = FALSE;\r
 }\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
@@ -46,16 +47,12 @@ BOOL CXkeymacsApp::InitInstance()
        // If you are not using these features and wish to reduce the size\r
        //  of your final executable, you should remove from the following\r
        //  the specific initialization routines you do not need.\r
-#ifdef _WIN64\r
-       m_hMutex = CreateMutex(FALSE, 0, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)) + _T("64"));\r
-#else\r
        m_hMutex = CreateMutex(FALSE, 0, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)));\r
-#endif\r
-    if (GetLastError() == ERROR_ALREADY_EXISTS) {\r
-        CloseHandle(m_hMutex);\r
+       if (GetLastError() == ERROR_ALREADY_EXISTS) {\r
+               CloseHandle(m_hMutex);\r
                m_hMutex = NULL;\r
-        return FALSE;\r
-    }\r
+               return FALSE;\r
+       }\r
 \r
 #ifdef _AFXDLL\r
        Enable3dControls();                     // Call this when using MFC in a shared DLL\r
@@ -83,12 +80,60 @@ BOOL CXkeymacsApp::InitInstance()
        SetClassLongPtr(m_pMainWnd->m_hWnd, GCLP_HICON, (LONG_PTR)LoadIcon(IDR_MAINFRAME));\r
 \r
        // set registry key\r
-       CProfile::InitDllData();\r
        CUtils::InitCUtils();\r
+       if (!Create64bitProcess())\r
+               return FALSE;\r
+       CProfile::InitDllData();\r
+\r
+       return TRUE;\r
+}\r
+\r
+BOOL CXkeymacsApp::IsWow64()\r
+{\r
+       return m_bIsWow64;\r
+}\r
 \r
+BOOL CXkeymacsApp::Create64bitProcess()\r
+{\r
+       typedef BOOL (WINAPI *PFIsWow64Process)(HANDLE, PBOOL);\r
+       PFIsWow64Process func = (PFIsWow64Process)GetProcAddress(GetModuleHandle(_T("kernel32")), _T("IsWow64Process"));\r
+       if (!func)\r
+               return TRUE; // IsWow64Process not exists\r
+       if (!func(GetCurrentProcess(), &m_bIsWow64))\r
+               return FALSE; // error\r
+       if (!m_bIsWow64)\r
+               return TRUE; // do nothing\r
+       \r
+       TCHAR szFileName[MAX_PATH];\r
+       if (!GetModuleFileName(NULL, szFileName, sizeof(szFileName)))\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
+               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
+               return FALSE;\r
+       // close unused handles\r
+       CloseHandle(pi.hProcess);\r
+       CloseHandle(pi.hThread);\r
        return TRUE;\r
 }\r
 \r
+BOOL CXkeymacsApp::SendIPCMessage(DWORD msg)\r
+{\r
+       if (!m_bIsWow64)\r
+               return TRUE;\r
+       DWORD ack, read;\r
+       return CallNamedPipe(IPC_PIPE, &msg, sizeof(msg), &ack, sizeof(DWORD), &read, 10000);\r
+}\r
+\r
 int CXkeymacsApp::ExitInstance() \r
 {\r
        if (m_hMutex) {\r