int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); HRESULT hRes = ::CoInitialize(NULL); // If you are running on NT 4.0 or higher you can use the following call instead to // make the EXE free threaded. This means that calls come in on a random RPC thread. //HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); ATLASSERT(SUCCEEDED(hRes)); // this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used ::DefWindowProc(NULL, 0, 0, 0L); AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other controls hRes = _Module.Init(NULL, hInstance); ATLASSERT(SUCCEEDED(hRes)); RimeSetupLogging("rime.weasel"); CreateDirectory(WeaselUserDataPath().c_str(), NULL); int ret = 0; HANDLE hMutex = CreateMutex(NULL, TRUE, L"WeaselDeployerExclusiveMutex"); if (!hMutex) { ret = 1; } else if (GetLastError() == ERROR_ALREADY_EXISTS) { ret = 1; } else { ret = Run(lpCmdLine); } if (hMutex) { CloseHandle(hMutex); } _Module.Term(); ::CoUninitialize(); return ret; }
void WeaselServerApp::SetupMenuHandlers() { std::wstring dir(install_dir()); m_server.AddMenuHandler(ID_WEASELTRAY_QUIT, boost::lambda::bind(&weasel::Server::Stop, boost::ref(m_server)) == 0); m_server.AddMenuHandler(ID_WEASELTRAY_DEPLOY, boost::lambda::bind(&execute, dir + L"\\WeaselDeployer.exe", std::wstring(L"/deploy"))); m_server.AddMenuHandler(ID_WEASELTRAY_SETTINGS, boost::lambda::bind(&execute, dir + L"\\WeaselDeployer.exe", std::wstring())); m_server.AddMenuHandler(ID_WEASELTRAY_DICT_MANAGEMENT, boost::lambda::bind(&execute, dir + L"\\WeaselDeployer.exe", std::wstring(L"/dict"))); m_server.AddMenuHandler(ID_WEASELTRAY_SYNC, boost::lambda::bind(&execute, dir + L"\\WeaselDeployer.exe", std::wstring(L"/sync"))); m_server.AddMenuHandler(ID_WEASELTRAY_WIKI, boost::lambda::bind(&open, L"http://code.google.com/p/rimeime/w/list")); m_server.AddMenuHandler(ID_WEASELTRAY_HOMEPAGE, boost::lambda::bind(&open, L"http://code.google.com/p/rimeime/")); m_server.AddMenuHandler(ID_WEASELTRAY_FORUM, boost::lambda::bind(&open, L"http://tieba.baidu.com/f?kw=rime")); m_server.AddMenuHandler(ID_WEASELTRAY_CHECKUPDATE, check_update); m_server.AddMenuHandler(ID_WEASELTRAY_INSTALLDIR, boost::lambda::bind(&explore, dir)); m_server.AddMenuHandler(ID_WEASELTRAY_USERCONFIG, boost::lambda::bind(&explore, WeaselUserDataPath())); }
void WeaselServerApp::SetupMenuHandlers() { WCHAR exe_path[MAX_PATH] = {0}; GetModuleFileNameW(GetModuleHandle(NULL), exe_path, _countof(exe_path)); std::wstring install_dir(exe_path); size_t pos = install_dir.find_last_of(L"\\"); install_dir.resize(pos); m_server.AddMenuHandler(ID_WEASELTRAY_QUIT, boost::lambda::bind(&weasel::Server::Stop, boost::ref(m_server)) == 0); m_server.AddMenuHandler(ID_WEASELTRAY_DEPLOY, boost::lambda::bind(&execute, install_dir + L"\\WeaselDeployer.exe", std::wstring(L"/deploy"))); m_server.AddMenuHandler(ID_WEASELTRAY_SETTINGS, boost::lambda::bind(&execute, install_dir + L"\\WeaselDeployer.exe", std::wstring())); m_server.AddMenuHandler(ID_WEASELTRAY_DICT_MANAGEMENT, boost::lambda::bind(&execute, install_dir + L"\\WeaselDeployer.exe", std::wstring(L"/dict"))); m_server.AddMenuHandler(ID_WEASELTRAY_WIKI, boost::lambda::bind(&open, L"http://code.google.com/p/rimeime/w/list")); m_server.AddMenuHandler(ID_WEASELTRAY_HOMEPAGE, boost::lambda::bind(&open, L"http://code.google.com/p/rimeime/")); m_server.AddMenuHandler(ID_WEASELTRAY_FORUM, boost::lambda::bind(&open, L"http://tieba.baidu.com/f?kw=rime")); m_server.AddMenuHandler(ID_WEASELTRAY_CHECKUPDATE, check_update); m_server.AddMenuHandler(ID_WEASELTRAY_INSTALLDIR, boost::lambda::bind(&explore, install_dir)); m_server.AddMenuHandler(ID_WEASELTRAY_USERCONFIG, boost::lambda::bind(&explore, WeaselUserDataPath())); }
const char* weasel_user_data_dir() { static char path[MAX_PATH] = {0}; WideCharToMultiByte(CP_UTF8, 0, WeaselUserDataPath().c_str(), -1, path, _countof(path) - 1, NULL, NULL); return path; }
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow) { // 防止服务进程开启输入法 ImmDisableIME(-1); { WCHAR user_name[20] = {0}; DWORD size = _countof(user_name); GetUserName(user_name, &size); if (!_wcsicmp(user_name, L"SYSTEM")) { return 1; } } HRESULT hRes = ::CoInitialize(NULL); // If you are running on NT 4.0 or higher you can use the following call instead to // make the EXE free threaded. This means that calls come in on a random RPC thread. //HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); ATLASSERT(SUCCEEDED(hRes)); // this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used ::DefWindowProc(NULL, 0, 0, 0L); AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other controls hRes = _Module.Init(NULL, hInstance); ATLASSERT(SUCCEEDED(hRes)); if (!wcscmp(L"/userdir", lpstrCmdLine)) { CreateDirectory(WeaselUserDataPath().c_str(), NULL); WeaselServerApp::explore(WeaselUserDataPath()); return 0; } if (!wcscmp(L"/weaseldir", lpstrCmdLine)) { WeaselServerApp::explore(WeaselServerApp::install_dir()); return 0; } // command line option /q stops the running server bool quit = !wcscmp(L"/q", lpstrCmdLine) || !wcscmp(L"/quit", lpstrCmdLine); // restart if already running { weasel::Client client; if (client.Connect()) // try to connect to running server { client.ShutdownServer(); } if (quit) return 0; } bool check_updates = !wcscmp(L"/update", lpstrCmdLine); if (check_updates) { WeaselServerApp::check_update(); } CreateDirectory(WeaselUserDataPath().c_str(), NULL); int nRet = 0; try { WeaselServerApp app; nRet = app.Run(); } catch (...) { // bad luck... nRet = -1; } _Module.Term(); ::CoUninitialize(); return nRet; }