OSDN Git Service

Start the 32bit process if the 64bit process previously starts.
[xkeymacs/xkeymacs.git] / xkeymacs / xkeymacs64.cpp
1 #include "stdafx.h"\r
2 #include "xkeymacs64.h"\r
3 #include "mainfrm64.h"\r
4 \r
5 CXkeymacsApp::CXkeymacsApp()\r
6 {\r
7         m_hMutex = NULL;\r
8 }\r
9 \r
10 CXkeymacsApp theApp;\r
11 \r
12 static UINT PollIPCMessage(LPVOID lpParam);\r
13 static void Start32bitProcess();\r
14 \r
15 BOOL CXkeymacsApp::InitInstance()\r
16 {\r
17         m_hMutex = CreateMutex(NULL, FALSE, _T("XKeymacs64"));\r
18         if (GetLastError() == ERROR_ALREADY_EXISTS) {\r
19                 CloseHandle(m_hMutex);\r
20                 m_hMutex = NULL;\r
21                 return FALSE;\r
22         }\r
23         bool start32bit = false;\r
24         HANDLE h32 = CreateMutex(NULL, FALSE, _T("XKeymacs"));\r
25         if (GetLastError() != ERROR_ALREADY_EXISTS)\r
26                 start32bit = true;\r
27         CloseHandle(h32);\r
28 \r
29         m_pMainWnd = new CMainFrame;\r
30         m_pMainWnd->ShowWindow(SW_HIDE);\r
31         m_pMainWnd->UpdateWindow();\r
32 \r
33         CUtils::InitCUtils();\r
34         AfxBeginThread(PollIPCMessage, NULL);\r
35         if (start32bit)\r
36                 Start32bitProcess();\r
37         CXkeymacsDll::SetHooks();\r
38         return TRUE;\r
39 }\r
40 \r
41 UINT PollIPCMessage(LPVOID lpParam)\r
42 {\r
43         HANDLE hPipe = CreateNamedPipe(IPC_PIPE, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1, 512, 512, 0, NULL);\r
44         if (hPipe == INVALID_HANDLE_VALUE)\r
45                 return 1;\r
46         for (; ;) {\r
47                 if (ConnectNamedPipe(hPipe, NULL) ? FALSE : (GetLastError() != ERROR_PIPE_CONNECTED))\r
48                         break;\r
49                 DWORD msg;\r
50                 DWORD read;\r
51                 if (!ReadFile(hPipe, &msg, sizeof(msg), &read, NULL) || read != sizeof(msg)) \r
52                         break;\r
53                 DWORD written, nul = 0;\r
54                 if (!WriteFile(hPipe, &nul, sizeof(DWORD), &written, NULL) || written != sizeof(DWORD)\r
55                                 || !FlushFileBuffers(hPipe) || !DisconnectNamedPipe(hPipe))\r
56                         break;\r
57                 switch (msg)\r
58                 {\r
59                 case XKEYMACS_EXIT:\r
60                         goto exit;\r
61                         break;\r
62                 case XKEYMACS_RELOAD:\r
63                         CXkeymacsDll::LoadConfig();\r
64                         break;\r
65                 case XKEYMACS_RESET:\r
66                         CXkeymacsDll::ResetHooks();\r
67                         break;\r
68                 }\r
69         }\r
70 exit:\r
71         CloseHandle(hPipe);\r
72         CXkeymacsDll::ReleaseHooks();\r
73         ExitProcess(0);\r
74         return 0;\r
75 }\r
76 \r
77 void Start32bitProcess()\r
78 {\r
79         TCHAR buf[MAX_PATH];\r
80         if (!GetModuleFileName(NULL, buf, MAX_PATH))\r
81                 return;\r
82         CString path = buf;\r
83         if (!path.Replace(_T("xkeymacs64.exe"), _T("xkeymacs.exe")))\r
84                 return;\r
85         STARTUPINFO si;\r
86         ZeroMemory(&si, sizeof(si));\r
87         si.cb = sizeof(si);\r
88         PROCESS_INFORMATION pi;\r
89         ZeroMemory(&pi, sizeof(pi));\r
90         if (!CreateProcess(path, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
91                 return;\r
92         // close unused handles\r
93         CloseHandle(pi.hProcess);\r
94         CloseHandle(pi.hThread);\r
95 }\r
96 \r
97 int CXkeymacsApp::ExitInstance() \r
98 {\r
99         if (m_hMutex) {\r
100                 CloseHandle(m_hMutex);\r
101 \r
102                 m_pMainWnd->DestroyWindow();\r
103                 delete m_pMainWnd;\r
104                 m_pMainWnd = NULL;\r
105         }\r
106 \r
107         return CWinApp::ExitInstance();\r
108 }\r