/* メインダイアログ用 WM_INITDIALOG 処理ルーチン */ BOOL TInstDlg::EvCreate(LPARAM lParam) { char title[256], title2[256]; GetWindowText(title, sizeof(title)); ::wsprintf(title2, "%s ver%s", title, GetVersionStr()); SetWindowText(title2); GetWindowRect(&rect); int cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN); int xsize = rect.right - rect.left, ysize = rect.bottom - rect.top; ::SetClassLong(hWnd, GCL_HICON, (LONG)::LoadIcon(TApp::GetInstance(), (LPCSTR)SETUP_ICON)); MoveWindow((cx - xsize)/2, (cy - ysize)/2, xsize, ysize, TRUE); Show(); if (IsWinVista() && !::IsUserAnAdmin() && TIsEnableUAC()) { HWND hRunas = GetDlgItem(RUNAS_BUTTON); ::SetWindowLong(hRunas, GWL_STYLE, ::GetWindowLong(hRunas, GWL_STYLE)|WS_VISIBLE); ::SendMessage(hRunas, BCM_SETSHIELD, 0, 1); } // 現在ディレクトリ設定 char buf[MAX_PATH_U8], setupDir[MAX_PATH_U8]; #ifdef _WIN64 char x86dir[MAX_PATH_U8] = ""; #endif // Program Filesのパス取り出し TRegistry reg(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_SETUP)) { if (reg.GetStr(REGSTR_PROGRAMFILES, buf, sizeof(buf))) { MakePath(setupDir, buf, IPMSG_STR); } #ifdef _WIN64 if (reg.GetStr(REGSTR_PROGRAMFILESX86, buf, sizeof(buf))) MakePath(x86dir, buf, IPMSG_STR); #endif reg.CloseKey(); } // 既にセットアップされている場合は、セットアップディレクトリを読み出す if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.OpenKey(IPMSG_EXENAME)) { if (reg.GetStr(REGSTR_PATH, buf, sizeof(buf))) { #ifdef _WIN64 if (strcmp(buf, x86dir)) #endif strcpy(setupDir, buf); } reg.CloseKey(); } reg.CloseKey(); } SetDlgItemTextU8(FILE_EDIT, setupDir); CheckDlgButton(STARTUP_CHECK, 1); CheckDlgButton(PROGRAM_CHECK, 1); CheckDlgButton(DESKTOP_CHECK, 1); CheckDlgButton(EXTRACT_CHECK, 0); char *p = strstr(GetCommandLine(), "runas="); if (p) { runasWnd = (HWND)strtoul(p+6, 0, 16); if (!runasWnd || !IsWindow(runasWnd)) PostQuitMessage(0); if ((p = strstr(p, ",imm="))) runasImm = atoi(p+5); CheckDlgButton(EXTRACT_CHECK, ::IsDlgButtonChecked(runasWnd, EXTRACT_CHECK)); CheckDlgButton(STARTUP_CHECK, ::IsDlgButtonChecked(runasWnd, STARTUP_CHECK)); CheckDlgButton(PROGRAM_CHECK, ::IsDlgButtonChecked(runasWnd, PROGRAM_CHECK)); CheckDlgButton(DESKTOP_CHECK, ::IsDlgButtonChecked(runasWnd, DESKTOP_CHECK)); WCHAR wbuf[MAX_PATH] = L""; ::SendDlgItemMessageW(runasWnd, FILE_EDIT, WM_GETTEXT, MAX_PATH, (LPARAM)wbuf); SetDlgItemTextU8(FILE_EDIT, WtoU8s(wbuf)); ::SendMessage(runasWnd, WM_IPMSG_HIDE, 0, 0); if (runasImm) { PostMessage(WM_IPMSG_INSTALL, 0, 0); } } return TRUE; }
BOOL TUninstDlg::UnInstall(void) { // 現在、起動中の ipmsg を終了 int st = TerminateIPMsg(); if (st == 1) return FALSE; if (st == 2) { if (!IsWinVista() || TIsUserAnAdmin() || !TIsEnableUAC()) { MessageBox(GetLoadStr(IDS_CANTTERMINATE), UNINSTALL_STR); return FALSE; } if (MessageBox(GetLoadStr(IDS_REQUIREADMIN_TERM), "", MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd); } if (!runasWnd && MessageBox(GetLoadStr(IDS_START), UNINSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; // 公開鍵削除 if (IsDlgButtonChecked(DELPUBKEY_CHECK)) { BOOL need_admin = FALSE; char contName[MAX_PATH_U8], userName[MAX_PATH_U8]; DWORD size = sizeof(userName); ::GetUserName(userName, &size); ::wsprintf(contName, "ipmsg.rsa2048.%s", userName); if (!DeleteKeySet(MS_ENHANCED_PROV, contName, CRYPT_MACHINE_KEYSET) || !DeleteKeySet(MS_ENHANCED_PROV, contName, 0)) need_admin = TRUE; ::wsprintf(contName, "ipmsg.rsa1024.%s", userName); if (!DeleteKeySet(MS_ENHANCED_PROV, contName, CRYPT_MACHINE_KEYSET) || !DeleteKeySet(MS_ENHANCED_PROV, contName, 0)) need_admin = TRUE; ::wsprintf(contName, "ipmsg.rsa512.%s", userName); if (!DeleteKeySet(MS_DEF_PROV, contName, CRYPT_MACHINE_KEYSET) || !DeleteKeySet(MS_DEF_PROV, contName, 0)) need_admin = TRUE; if (need_admin) { if (IsWinVista() && !TIsUserAnAdmin() && TIsEnableUAC()) { if (MessageBox(GetLoadStr(IDS_REQUIREADMIN_PUBKEY), "", MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd); } } } // スタートアップ&デスクトップから削除 TRegistry reg(HKEY_CURRENT_USER); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char buf[MAX_PATH_U8]; char *regStr[] = { REGSTR_STARTUP, REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; for (int i=0; regStr[i]; i++) { if (reg.GetStr(regStr[i], buf, sizeof(buf))) { if (i == 0) RemoveSameLink(buf); ::wsprintf(buf + strlen(buf), "\\%s", IPMSG_SHORTCUT_NAME); DeleteLink(buf); } } reg.CloseKey(); } // レジストリからユーザー設定情報を削除 if (reg.ChangeApp(HSTOOLS_STR)) reg.DeleteChildTree(GetLoadStr(IDS_REGIPMSG)); // レジストリからアプリケーション情報を削除 char setupDir[MAX_PATH_U8]; // セットアップディレクトリ情報を保存 GetDlgItemTextU8(RESETUP_EDIT, setupDir, sizeof(setupDir)); reg.ChangeTopKey(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.OpenKey(IPMSG_EXENAME)) { reg.GetStr(REGSTR_PATH, setupDir, sizeof(setupDir)); reg.CloseKey(); } reg.DeleteKey(IPMSG_EXENAME); reg.CloseKey(); } // レジストリからアンインストール情報を削除 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { reg.DeleteKey(IPMSG_NAME); reg.CloseKey(); } // 終了メッセージ MessageBox(GetLoadStr(IDS_UNINSTCOMPLETE)); // インストールディレクトリを開く if (GetDriveTypeEx(setupDir) != DRIVE_REMOTE) ShellExecuteU8(NULL, NULL, setupDir, 0, 0, SW_SHOW); ::PostQuitMessage(0); return TRUE; }
BOOL TInstDlg::Install(void) { char buf[MAX_PATH_U8], setupDir[MAX_PATH_U8], setupPath[MAX_PATH_U8]; char installPath[MAX_PATH_U8]; BOOL extract_only = IsDlgButtonChecked(EXTRACT_CHECK); // 現在、起動中の ipmsg を終了 int st = extract_only ? 0 : TerminateIPMsg(); if (st == 1) return FALSE; // インストールパス設定 GetDlgItemTextU8(FILE_EDIT, setupDir, sizeof(setupDir)); if (IsWinVista() && !::IsUserAnAdmin() && TIsEnableUAC() && TIsVirtualizedDirW(U8toWs(setupDir))) { if (MessageBox(GetLoadStr(IDS_REQUIREADMIN), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; return RunAsAdmin(hWnd, TRUE); } CreateDirectoryU8(setupDir, NULL); DWORD attr = GetFileAttributesU8(setupDir); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) return MessageBox(GetLoadStr(IDS_NOTCREATEDIR), INSTALL_STR), FALSE; MakePath(setupPath, setupDir, IPMSG_EXENAME); if (st == 2) { MessageBox(GetLoadStr(IDS_CANTTERMINATE), INSTALL_STR); return FALSE; } if (!runasImm && MessageBox(GetLoadStr(IDS_START), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) { return FALSE; } runasImm = FALSE; // ファイル生成 for (int i=0; SetupFiles[i]; i++) { MakePath(installPath, setupDir, SetupFiles[i]); CreateStatus cs = CreateFileBySelf(installPath, SetupFiles[i]); if (cs == CS_BROKEN) { MessageBox(GetLoadStr(IDS_BROKENARCHIVE), INSTALL_STR); return FALSE; } else if (cs == CS_ACCESS) { const char *msg = Fmt("%s\r\n%s", GetLoadStrU8(IDS_NOTCREATEFILE), installPath); MessageBoxU8(msg, INSTALL_STR); return FALSE; } } // 展開のみ if (extract_only) { ShellExecuteW(NULL, NULL, U8toWs(setupDir), 0, 0, SW_SHOW); return TRUE; } // スタートアップ&デスクトップに登録 TRegistry reg(HKEY_CURRENT_USER); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char *regStr[] = { REGSTR_STARTUP, REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; BOOL resId[] = { STARTUP_CHECK, PROGRAM_CHECK, DESKTOP_CHECK, NULL }; for (int i=0; regStr[i]; i++) { if (reg.GetStr(regStr[i], buf, sizeof(buf))) { if (i != 0 || !RemoveSameLink(buf, buf)) ::wsprintf(buf + strlen(buf), "\\%s", IPMSG_SHORTCUT_NAME); if (IsDlgButtonChecked(resId[i])) SymLink(setupPath, buf); else DeleteLink(buf); } } reg.CloseKey(); } // レジストリにアプリケーション情報を登録 reg.ChangeTopKey(HKEY_LOCAL_MACHINE); if (reg.OpenKey(REGSTR_PATH_APPPATHS)) { if (reg.CreateKey(IPMSG_EXENAME)) { reg.SetStr(NULL, setupPath); reg.SetStr(REGSTR_PATH, setupDir); reg.CloseKey(); } reg.CloseKey(); } // レジストリにアンインストール情報を登録 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.CreateKey(IPMSG_NAME)) { MakePath(buf, setupDir, SETUP_EXENAME); strcat(buf, " /r"); reg.SetStr(REGSTR_VAL_UNINSTALLER_DISPLAYNAME, IPMSG_FULLNAME); reg.SetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, buf); reg.CloseKey(); } reg.CloseKey(); } // コピーしたアプリケーションを起動 const char *msg = GetLoadStr(IDS_SETUPCOMPLETE); int flg = MB_OKCANCEL|MB_ICONINFORMATION; // if (IsWinVista() && ::IsUserAnAdmin() && TIsEnableUAC()) { // msg = Fmt("%s%s", msg, GetLoadStr(IDS_COMPLETE_UACADD)); // flg |= MB_DEFBUTTON2; // } TLaunchDlg dlg(msg, this); if (dlg.Exec() == IDOK) { if (runasWnd) { Wstr wbuf(setupDir); if (::SendDlgItemMessageW(runasWnd, FILE_EDIT, WM_SETTEXT, 0, (LPARAM)wbuf.Buf())) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 1, 0); runasWnd = NULL; } } else { AppKick(); } } else { HWND hHelp = ShowHelpU8(0, setupDir, GetLoadStrU8(IDS_IPMSGHELP), "#history"); if (hHelp) { Show(SW_HIDE); while (::IsWindow(hHelp)) { this->Sleep(100); } } } if (runasWnd) { ::PostMessage(runasWnd, WM_IPMSG_QUIT, 0, 0); runasWnd = NULL; } // ShellExecuteU8(NULL, NULL, setupDir, 0, 0, SW_SHOW); ::PostQuitMessage(0); return TRUE; }