CXkeymacsApp::CXkeymacsApp()\r
{\r
m_hMutex = NULL;\r
+ m_bIsWow64 = FALSE;\r
}\r
\r
/////////////////////////////////////////////////////////////////////////////\r
// 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
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