// // Windows メイン関数 // int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgs, int nWinMode) { MSG msg; HWND hMain; int err; // 初期化 install_flag = FALSE; uninstall_flag = FALSE; read_ini_flag = FALSE; start_flag = FALSE; no_error_flag = FALSE; question_flag = FALSE; ok_flag = FALSE; h_instance = hInstance; // 実行ディレクトリにある sexe.exe のフルパスを作成 GetModuleFileName(NULL, module_name, sizeof(module_name)); lstrcpy(execute_path, module_name); extract_directory(execute_path); lstrcpy(ini_name, execute_path); lstrcat(ini_name, _T("\\sexe.ini")); // コマンドライン解析 analyze_args(lpszArgs); // サービスで動作しているか? service_flag = check_execute_service(); // WindowsNT/2000 ? if(nt_flag) { // サービスとして動作中? if(service_flag) { // すでに動作中? if(!check_already()) { // サービスとして起動 start_service(); } } else { // 2011/5/31 // コマンドラインパラメータでインストール・アンインストール if(install_flag) { TCHAR *ext; if(service_name[0] == _T('\0')) { if(!no_error_flag) { // サービス名を指定してください MessageBoxResourceText(NULL, IDS_ERROR_NO_SERVICE_NAME, NULL, ERROR_HEADER, MB_OK); } return ERROR_PARAMETER; } ext = extract_ext(exe_name); if(exe_name[0] == _T('\0') || (_tcsicmp(ext, _T("exe")) && _tcsicmp(ext, _T("bat")))) { if(!no_error_flag) { // プログラム名を指定してください MessageBoxResourceText(NULL, IDS_ERROR_NO_PROGRAM_NAME, NULL, ERROR_HEADER, MB_OK); } return ERROR_PARAMETER; } if(question_flag) { // サービス service_name を登録しますか? if(MessageBoxResourceText(NULL, IDS_QUESTION_INSTALL, service_name, ERROR_HEADER, MB_YESNO) != IDYES) { return ERROR_NO_INSTALL; } } if(!read_ini_flag) { // ini ファイルから読み出したのでなければ設定値を保存 set_inifile(); } // インストール if((err = install_service()) == ERROR_SUCCESS) { if(start_flag) { // サービス開始 if(restart_service()) { if(ok_flag) { // サービス service_name を登録し、開始しました。 MessageBoxResourceText(NULL, IDS_INSTALL_START_OK, service_name, HEADER, MB_OK); } } else if(!no_error_flag) { // サービス service_name を登録しましたが、開始に失敗しました。 MessageBoxResourceText(NULL, IDS_ERROR_INSTALL_START, service_name, HEADER, MB_OK); return ERROR_START; } } else if(ok_flag) { // サービス service_name を登録しました。 MessageBoxResourceText(NULL, IDS_INSTALL_OK, service_name, HEADER, MB_OK); } } else { if(!no_error_flag) { if(err == ERROR_SERVICE_EXISTS) { // すでに同名のサービスが登録済みです MessageBoxResourceText(NULL, IDS_ERROR_SAME_SERVICE, NULL, ERROR_HEADER, MB_OK); } else { // サービスに登録できませんでした。\nサービスの権限があるユーザーでログインして実行してください。 MessageBoxResourceText(NULL, IDS_ERROR_INSTALL_SERVICE, NULL, ERROR_HEADER, MB_OK); } } return ERROR_INSTALL; } } else if(uninstall_flag) { if(service_name[0] == _T('\0')) { if(!no_error_flag) { // サービス名を指定してください MessageBoxResourceText(NULL, IDS_ERROR_NO_SERVICE_NAME, NULL, ERROR_HEADER, MB_OK); } return ERROR_PARAMETER; } if(question_flag) { // サービス service_name を削除しますか? if(MessageBoxResourceText(NULL, IDS_QUESTION_UNINSTALL, service_name, HEADER, MB_YESNO) != IDYES) { return ERROR_NO_INSTALL; } } if(service_install_flag) { // サービスから削除 if(remove_service()) { if(ok_flag) { // サービス service_name を削除しました MessageBoxResourceText(NULL, IDS_UNINSTALL_OK, service_name, HEADER, MB_OK); } } else { if(!no_error_flag) { // サービスから削除できませんでした。\nサービスの権限があるユーザーでログインして実行してください。 MessageBoxResourceText(NULL, IDS_ERROR_UNINSTALL_SERVICE, NULL, ERROR_HEADER, MB_OK); } return ERROR_INSTALL; } } else { if(!no_error_flag) { // サービス service_name は登録されていません MessageBoxResourceText(NULL, IDS_ERROR_NOT_INSTALL_SERVICE, service_name, ERROR_HEADER, MB_OK); } return ERROR_INSTALL; } } else { // 2010/6/10 Vista/7 で WM_DROPFILES を受ける funcChangeWindowMessageFilter ChangeWindowMessageFilter; if(ChangeWindowMessageFilter = (funcChangeWindowMessageFilter)GetProcAddress(LoadLibrary(_T("user32.dll")) ,"ChangeWindowMessageFilter")) { ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD); ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); } // 設定ダイアログを表示 hMain = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG_SETUP), GetDesktopWindow(), (DLGPROC)MainFunc); ShowWindow(hMain, SW_SHOW); // Drag&Drop を受け入れる準備 DragAcceptFiles(hMain, TRUE); while(GetMessage(&msg, NULL, 0, 0)) { if(!IsDialogMessage(hMain, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } } else { // Windows NT/2000/XP/Vista/7 で起動してください。 MessageBoxResourceText(NULL, IDS_ERROR_OS, NULL, ERROR_HEADER, MB_OK); } return 0; }
void hc_scheduler_start(hc_tree_opaque_t *services, int port, hc_sequence_callback_t start_cb, void *cookie) { int operation_performed; hc_error_t *error = NULL; hc_service_t *service = NULL; hc_sequence_t *sequence = NULL; hc_service_filter_t filter; _global_datas.running = 1; _global_datas.services = services; _global_datas.server_socket = -1; _global_datas.sequences = hc_list_allocate(NULL); if (!_global_datas.sequences) { cm_trace(CM_TRACE_LEVEL_ERROR, "hc_list_allocate failed. Couldn't create the list of sequences"); return; } _global_datas.errors = hc_list_allocate(NULL); if (!_global_datas.errors) { cm_trace(CM_TRACE_LEVEL_ERROR, "hc_list_allocate failed. Couldn't create a queue for errors"); hc_list_free(_global_datas.sequences, NULL); return; } /* Create the first sequence (starting the SYSTEM services) */ /* hc_monitor_enable_detection(1); */ filter = HC_FILTER_GROUP_SYSTEM | HC_FILTER_NODE_ANYNODE; if (is_master()) { filter |= HC_FILTER_NODE_MASTER; } hc_config_lock(NULL, HC_DOMAIN_ALL, filter, 0); _global_datas.allowed_groups = HC_FILTER_GROUP_SYSTEM; sequence = create_sequence_from_services(hc_scheduler_get_services(), HC_DOMAIN_ALL, filter, start_components_creator, HC_SEQUENCE_EXECUTION_NORMAL, start_cb, cookie, NULL); if (!sequence) { cm_trace(CM_TRACE_LEVEL_ERROR, "Couldn't create the sequence to start the SYSTEM components"); } if (sequence) { hc_scheduler_add_sequence(sequence); sequence = create_sequence_from_services(hc_scheduler_get_services(), HC_DOMAIN_ALL, filter, state_change_creator, HC_SEQUENCE_EXECUTION_NORMAL, NULL, NULL, (void*)SRV_RUNNING); if (!sequence) { cm_trace(CM_TRACE_LEVEL_ERROR, "Couldn't create the sequence to put the SYSTEM components RUNNING"); } else { hc_scheduler_add_sequence(sequence); } } /* Starting the request server */ _global_datas.server_socket = hc_server_start(port); if (_global_datas.server_socket == -1) { cm_trace(CM_TRACE_LEVEL_ERROR, "Failed to start the server"); hc_list_free(_global_datas.sequences, hc_sequence_simple_free); hc_list_free(_global_datas.errors, NULL); return; } cm_trace(CM_TRACE_LEVEL_NOTICE, "The scheduler has been started"); while (_global_datas.running) { operation_performed = 0; operation_performed += schedule_sequences(); if (operation_performed) { cm_trace(CM_TRACE_LEVEL_DEBUG, "Some action have been executed"); } hc_forker_check(_global_datas.errors); hc_monitor_services(_global_datas.errors); error = (hc_error_t*)hc_list_extract_first_element(_global_datas.errors); while (error) { service = (hc_service_t*)hc_tree_get_datas(error->service_node); switch (error->type) { case HC_ERROR_DISABLED_SERVICE: cm_trace(CM_TRACE_LEVEL_DEBUG, "A HC_ERROR_DISABLED_SERVICE has been received for service %s", service->start_cmd); if (service->nb_ongoing_operations == 0) { /* We increase operation_performed not to block at the * scheduler loop and to execute the RESTART sequence * as fast as possible */ operation_performed++; restart_service(error->service_node); } else { cm_trace(CM_TRACE_LEVEL_DEBUG, "Does not restart %s, since there is already an operation affecting it", service->start_cmd); } (int)update_mailbox(); break; default: cm_trace(CM_TRACE_LEVEL_ERROR, "Got an unexpected error report %d", error->type); } hc_error_free(error); error = (hc_error_t*)hc_list_extract_first_element(_global_datas.errors); } if (operation_performed) { cm_trace(CM_TRACE_LEVEL_DEBUG, "Polling server without waiting"); (int)update_mailbox(); hc_server_wait(_global_datas.server_socket, 0); } else { hc_server_wait(_global_datas.server_socket, 500); } } close(_global_datas.server_socket); _global_datas.server_socket = -1; hc_list_free(_global_datas.sequences, hc_sequence_simple_free); _global_datas.sequences = NULL; hc_list_free(_global_datas.errors, NULL); _global_datas.errors = NULL; cmm_dispose(); cm_trace(CM_TRACE_LEVEL_DEBUG, "The scheduler is exiting"); }
// // ダイアログメッセージ処理 // BOOL APIENTRY MainFunc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND h; HDROP hDrop; OPENFILENAME ofn; HICON hicon; TCHAR temp[MAX_PATH]; TCHAR *ext; switch(message) { case WM_INITDIALOG: // アイコンをセット if(hicon = LoadIcon(h_instance, MAKEINTRESOURCE(IDI_ICON_SEXE))) { SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hicon); SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hicon); } // 設定値をコントロールにセット h = GetDlgItem(hDlg, IDC_EDIT_EXE); SendMessage(h, EM_LIMITTEXT, MAX_PATH, 0); SetWindowText(h, exe_name); EnableWindow(h, !service_install_flag); h = GetDlgItem(hDlg, IDC_EDIT_OPTION); SendMessage(h, EM_LIMITTEXT, MAX_PATH, 0); SetWindowText(h, option_name); EnableWindow(h, !service_install_flag); h = GetDlgItem(hDlg, IDC_EDIT_NAME); SendMessage(h, EM_LIMITTEXT, MAX_PATH, 0); SetWindowText(h, service_name); EnableWindow(h, !service_install_flag); h = GetDlgItem(hDlg, IDC_EDIT_DESCRIPTION); SendMessage(h, EM_LIMITTEXT, MAX_PATH, 0); SetWindowText(h, description_name); EnableWindow(h, !service_install_flag); h = GetDlgItem(hDlg, IDC_COMBO_END); LoadString(h_instance, IDS_ITEM_CLOSE, temp, MAX_PATH); SendMessage(h, CB_ADDSTRING, 0, (DWORD_PTR)temp); // 2002/6/18 LoadString(h_instance, IDS_ITEM_SYSCOMMAND, temp, MAX_PATH); SendMessage(h, CB_ADDSTRING, 0, (DWORD_PTR)temp); LoadString(h_instance, IDS_ITEM_SYS_CLOSE, temp, MAX_PATH); SendMessage(h, CB_ADDSTRING, 0, (DWORD_PTR)temp); // 2004/8/9 LoadString(h_instance, IDS_ITEM_CTRL_BREAK, temp, MAX_PATH); SendMessage(h, CB_ADDSTRING, 0, (DWORD_PTR)temp); SendMessage(h, CB_SETCURSEL, end_pattern, 0); EnableWindow(h, !service_install_flag); // 2001/11/9 h = GetDlgItem(hDlg, IDC_BUTTON_EXE); EnableWindow(h, !service_install_flag); h = GetDlgItem(hDlg, IDC_BUTTON_TEST); if(service_install_flag) { LoadString(h_instance, IDS_BUTTON_DELETE, temp, MAX_PATH); SetWindowText(h, temp); } // 2004/8/9 h = GetDlgItem(hDlg, IDC_CHECK_AUTO); SendMessage(h, BM_SETCHECK, auto_flag, 0); EnableWindow(h, !service_install_flag); h = GetDlgItem(hDlg, IDC_CHECK_DESKTOP); SendMessage(h, BM_SETCHECK, desktop_flag, 0); EnableWindow(h, !service_install_flag); h = GetDlgItem(hDlg, IDC_CHECK_RETRY); SendMessage(h, BM_SETCHECK, retry_flag, 0); EnableWindow(h, !service_install_flag); break; case WM_COMMAND: switch(LOWORD (wParam)) { case IDOK: // 設定値得る if(!service_install_flag) { h = GetDlgItem(hDlg, IDC_EDIT_NAME); GetWindowText(h, service_name, MAX_PATH); if(service_name[0] == _T('\0')) { // サービス名を指定してください MessageBoxResourceText(hDlg, IDS_ERROR_NO_SERVICE_NAME, NULL, ERROR_HEADER, MB_OK); break; } h = GetDlgItem(hDlg, IDC_EDIT_EXE); GetWindowText(h, exe_name, MAX_PATH); // 2007/12/14 test ext = extract_ext(exe_name); if(exe_name[0] == _T('\0') || (_tcsicmp(ext, _T("exe")) && _tcsicmp(ext, _T("bat")))) { // プログラム名を指定してください MessageBoxResourceText(hDlg, IDS_ERROR_NO_PROGRAM_NAME, NULL, ERROR_HEADER, MB_OK); break; } h = GetDlgItem(hDlg, IDC_EDIT_OPTION); GetWindowText(h, option_name, MAX_PATH); h = GetDlgItem(hDlg, IDC_EDIT_DESCRIPTION); GetWindowText(h, description_name, MAX_PATH); h = GetDlgItem(hDlg, IDC_COMBO_END); end_pattern = (int)SendMessage(h, CB_GETCURSEL, 0, 0); // 2004/8/9 h = GetDlgItem(hDlg, IDC_CHECK_AUTO); auto_flag = (int)SendMessage(h, BM_GETCHECK, 0, 0); h = GetDlgItem(hDlg, IDC_CHECK_DESKTOP); desktop_flag = (int)SendMessage(h, BM_GETCHECK, 0, 0); h = GetDlgItem(hDlg, IDC_CHECK_RETRY); retry_flag = (int)SendMessage(h, BM_GETCHECK, 0, 0); // 設定値を保存 set_inifile(); // サービス %s を登録しますか? if(MessageBoxResourceText(hDlg, IDS_QUESTION_INSTALL, service_name, HEADER, MB_YESNO) == IDYES) { int err; if((err = install_service()) == ERROR_SUCCESS) { // 2001/11/9 // サービス %s を登録しました。サービスとして起動しますか? if(MessageBoxResourceText(hDlg, IDS_QUESTION_INSTALL_START, service_name, HEADER, MB_YESNO) == IDYES) { restart_service(); } } else { if(err == ERROR_SERVICE_EXISTS) { // すでに同名のサービスが登録済みです MessageBoxResourceText(NULL, IDS_ERROR_SAME_SERVICE, NULL, ERROR_HEADER, MB_OK); } else { // サービスに登録できませんでした。\nサービスの権限があるユーザーでログインして実行してください。 MessageBoxResourceText(hDlg, IDS_ERROR_INSTALL_SERVICE, NULL, HEADER, MB_OK); } } } } DestroyWindow(hDlg); break; case IDCANCEL: DestroyWindow(hDlg); break; case IDC_BUTTON_EXE: { TCHAR filter[MAX_PATH]; TCHAR title[MAX_PATH]; int len; // 参照ボタンが押された temp[0] = '\0'; FillMemory(&ofn, sizeof(OPENFILENAME), 0); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.nMaxFile = MAX_PATH; ofn.lpstrFile = temp; // 実行ファイル(*.exe)\0*.exe\0" LoadString(h_instance, IDS_FILE_EXE, filter, MAX_PATH); len = lstrlen(filter); LoadString(h_instance, IDS_FILE_WILD_EXE, filter + len + 1, MAX_PATH - len - 2); len += lstrlen(filter + len + 1); *(filter + len + 2) = '\0'; ofn.lpstrFilter = filter; // 実行ファイルの選択 LoadString(h_instance, IDS_FILE_TITLE, title, MAX_PATH); ofn.lpstrTitle = title; ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; if(GetOpenFileName(&ofn)) { ext = extract_ext(temp); if(!_tcsicmp(ext, _T("exe")) || !_tcsicmp(ext, _T("bat"))) { TCHAR name[MAX_PATH]; // .exe ファイルをセット h = GetDlgItem(hDlg, IDC_EDIT_EXE); SetWindowText(h, (LPCTSTR)temp); // サービス名として .exe ファイルの名前をセット extract_name_only(name, temp); h = GetDlgItem(hDlg, IDC_EDIT_NAME); SetWindowText(h, (LPCTSTR)name); } else { // プログラムファイルのみ登録可能です。 MessageBoxResourceText(hDlg, IDS_ERROR_NOT_PROGRAM, NULL, ERROR_HEADER, MB_OK); } } } break; case IDC_BUTTON_TEST: // サービスとしてインストール済み? if(service_install_flag) { // サービス service_name を削除しますか? if(MessageBoxResourceText(hDlg, IDS_QUESTION_UNINSTALL, service_name, HEADER, MB_YESNO) == IDYES) { // サービスから削除 if(remove_service()) { // サービス service_name を削除しました MessageBoxResourceText(hDlg, IDS_UNINSTALL_OK, service_name, HEADER, MB_OK); service_install_flag = FALSE; h = GetDlgItem(hDlg, IDC_EDIT_EXE); EnableWindow(h, TRUE); h = GetDlgItem(hDlg, IDC_EDIT_OPTION); EnableWindow(h, TRUE); h = GetDlgItem(hDlg, IDC_EDIT_NAME); EnableWindow(h, TRUE); h = GetDlgItem(hDlg, IDC_EDIT_DESCRIPTION); EnableWindow(h, TRUE); h = GetDlgItem(hDlg, IDC_COMBO_END); EnableWindow(h, TRUE); // 2001/11/9 h = GetDlgItem(hDlg, IDC_BUTTON_EXE); EnableWindow(h, TRUE); h = GetDlgItem(hDlg, IDC_BUTTON_TEST); // テスト起動(&T) LoadString(h_instance, IDS_BUTTON_TEST, temp, MAX_PATH); SetWindowText(h, temp); // 2004/8/9 h = GetDlgItem(hDlg, IDC_CHECK_AUTO); EnableWindow(h, TRUE); h = GetDlgItem(hDlg, IDC_CHECK_DESKTOP); EnableWindow(h, TRUE); h = GetDlgItem(hDlg, IDC_CHECK_RETRY); EnableWindow(h, TRUE); } else { // サービスから削除できませんでした。\nサービスの権限があるユーザーでログインして実行してください。 MessageBoxResourceText(NULL, IDS_ERROR_UNINSTALL_SERVICE, NULL, ERROR_HEADER, MB_OK); } } } else { TCHAR param[MAX_PATH]; // テスト起動処理 h = GetDlgItem(hDlg, IDC_EDIT_EXE); GetWindowText(h, temp, MAX_PATH); h = GetDlgItem(hDlg, IDC_EDIT_OPTION); GetWindowText(h, param, MAX_PATH); h = GetDlgItem(hDlg, IDC_COMBO_END); execute_program(hDlg, temp, param, (int)SendMessage(h, CB_GETCURSEL, 0, 0)); } break; } break; case WM_DROPFILES: // Drag&Drop で受けたファイル名を取り出す hDrop = (HDROP)wParam; DragQueryFile(hDrop, 0, temp, MAX_PATH); DragFinish(hDrop); if(!service_install_flag) { if(!_tcsicmp(extract_ext(temp), _T("exe"))) { TCHAR name[MAX_PATH]; // .exe ファイルをセット h = GetDlgItem(hDlg, IDC_EDIT_EXE); SetWindowText(h, temp); // サービス名として .exe ファイルの名前をセット extract_name_only(name, temp); h = GetDlgItem(hDlg, IDC_EDIT_NAME); SetWindowText(h, (LPCTSTR)name); } else { // プログラムファイルのみ登録可能です。 MessageBoxResourceText(hDlg, IDS_ERROR_NOT_PROGRAM, NULL, ERROR_HEADER, MB_OK); } } SetForegroundWindow(hDlg); break; case WM_HELP: ShellExecute(hDlg, _T("open"), _T("sexe.chm"), NULL, NULL, SW_SHOW); break; case WM_DESTROY: // 2001/11/9 if(service_stop_flag) { restart_service(); } PostQuitMessage(0); break; default: return FALSE; } return FALSE; }