void TInetSetUserAgent(const char *key) { TInetSetUserAgentRaw(Fmt("%s (Windows NT %d.%d.%d%s)", key, TOSVerInfo.dwMajorVersion, TOSVerInfo.dwMinorVersion, TOSVerInfo.dwBuildNumber, #ifdef _WIN64 "; Win64" #else TIsWow64() ? "; WOW64" : "" #endif )); }
BOOL TInstDlg::UnInstall(void) { char buf[MAX_PATH]; char setupDir[MAX_PATH] = ""; ::GetModuleFileName(NULL, setupDir, sizeof(setupDir)); GetParentDir(setupDir, setupDir); BOOL is_shext = FALSE; is_shext = ShellExtFunc(setupDir, CHECK_SHELLEXT); if (is_shext && IsWinVista() && !TIsUserAnAdmin()) { RunAsAdmin(TRUE); return TRUE; } if (MessageBox(GetLoadStr(IDS_START), UNINSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; // スタートメニュー&デスクトップから削除 TRegistry reg(HKEY_CURRENT_USER, BY_MBCS); if (reg.OpenKey(REGSTR_SHELLFOLDERS)) { char *regStr[] = { REGSTR_PROGRAMS, REGSTR_DESKTOP, NULL }; for (int cnt=0; regStr[cnt] != NULL; cnt++) { if (reg.GetStr(regStr[cnt], buf, sizeof(buf))) { if (cnt == 0) RemoveSameLink(buf); ::wsprintf(buf + strlen(buf), "\\%s", FASTCOPY_SHORTCUT); if (IS_WINNT_V) { Wstr w_buf(buf, BY_MBCS); DeleteLinkV(w_buf.Buf()); } else { DeleteLinkV(buf); } } } reg.CloseKey(); } ShellExtFunc(setupDir, UNREGISTER_SHELLEXT); #ifdef _WIN64 if (IS_WINNT_V) { #else if (IS_WINNT_V && TIsWow64()) { #endif SHELLEXECUTEINFO sei = { sizeof(sei) }; char arg[1024]; sprintf(arg, "\"%s\\%s\",%s", setupDir, CURRENT_SHEXTDLL_EX, "DllUnregisterServer"); sei.lpFile = "rundll32.exe"; sei.lpParameters = arg; ShellExecuteEx(&sei); } // レジストリからアンインストール情報を削除 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.OpenKey(FASTCOPY)) { if (reg.GetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, setupDir, sizeof(setupDir))) GetParentDir(setupDir, setupDir); reg.CloseKey(); } reg.DeleteKey(FASTCOPY); reg.CloseKey(); } // 終了メッセージ MessageBox(is_shext ? GetLoadStr(IDS_UNINSTSHEXTFIN) : GetLoadStr(IDS_UNINSTFIN)); // インストールディレクトリを開く if (GetFileAttributes(setupDir) != 0xffffffff) { ::ShellExecute(NULL, NULL, setupDir, 0, 0, SW_SHOW); } // AppDataディレクトリを開く if (IsWinVista()) { WCHAR wbuf[MAX_PATH] = L"", upath[MAX_PATH] = L""; WCHAR fastcopy_dir[MAX_PATH] = L"", *fastcopy_dirname = NULL; Wstr w_setup(setupDir); if (TIsVirtualizedDirV(w_setup.Buf())) { if (TSHGetSpecialFolderPathV(NULL, wbuf, CSIDL_APPDATA, FALSE)) { GetFullPathNameW(w_setup.Buf(), MAX_PATH, fastcopy_dir, &fastcopy_dirname); MakePathV(upath, wbuf, fastcopy_dirname); if (GetFileAttributesV(upath) != 0xffffffff) { ::ShellExecuteW(NULL, NULL, upath, 0, 0, SW_SHOW); } } } } ::PostQuitMessage(0); return TRUE; } BOOL ReadLink(char *src, char *dest, char *arg=NULL) { IShellLink *shellLink; // 実際は IShellLinkA or IShellLinkW IPersistFile *persistFile; WCHAR wbuf[MAX_PATH]; BOOL ret = FALSE; if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&shellLink))) { if (SUCCEEDED(shellLink->QueryInterface(IID_IPersistFile, (void **)&persistFile))) { AtoW(src, wbuf, MAX_PATH); if (SUCCEEDED(persistFile->Load(wbuf, STGM_READ))) { if (SUCCEEDED(shellLink->GetPath(dest, MAX_PATH, NULL, 0))) { if (arg) { shellLink->GetArguments(arg, MAX_PATH); } ret = TRUE; } } persistFile->Release(); } shellLink->Release(); } return ret; }
"@(#)Copyright (C) 2005-2012 H.Shirouzu install.cpp Ver2.11"; /* ======================================================================== Project Name : Installer for FastCopy Module Name : Installer Application Class Create : 2005-02-02(Wed) Update : 2012-06-18(Mon) Copyright : H.Shirouzu Reference : ======================================================================== */ #include "../tlib/tlib.h" #include "stdio.h" #include "instrc.h" #include "install.h" char *current_shell = TIsWow64() ? CURRENT_SHEXTDLL_EX : CURRENT_SHEXTDLL; char *SetupFiles [] = { FASTCOPY_EXE, INSTALL_EXE, CURRENT_SHEXTDLL, CURRENT_SHEXTDLL_EX, README_TXT, HELP_CHM, NULL }; /* Vista以降 */ #ifdef _WIN64 BOOL ConvertToX86Dir(void *target) { WCHAR buf[MAX_PATH]; WCHAR buf86[MAX_PATH]; int len; if (!TSHGetSpecialFolderPathV(NULL, buf, CSIDL_PROGRAM_FILES, FALSE)) return FALSE;
BOOL TShellExtDlg::RegisterShellExt(BOOL is_register) { if (shellExt.Status() == FALSE) return FALSE; cfg->shextNoConfirm = is_register && IsDlgButtonChecked(NOCONFIRM_CHECK); cfg->shextNoConfirmDel = is_register && IsDlgButtonChecked(NOCONFIRMDEL_CHECK); cfg->shextTaskTray = is_register && IsDlgButtonChecked(TASKTRAY_CHECK); cfg->shextAutoClose = IsDlgButtonChecked(AUTOCLOSE_CHECK); cfg->WriteIni(); #ifdef _WIN64 if (1) { #else if (TIsWow64()) { #endif WCHAR arg[1024]; Wstr cur_shell_ex(CURRENT_SHEXTDLL_EX); Wstr reg_proc(REGISTER_PROC); Wstr unreg_proc(UNREGISTER_PROC); swprintf(arg, L"\"%s\\%s\",%s", cfg->execDir, cur_shell_ex.Buf(), is_register ? reg_proc.Buf() : unreg_proc.Buf()); SHELLEXECUTEINFOW sei = { sizeof(sei) }; sei.lpFile = L"rundll32.exe"; sei.lpParameters = arg; ::ShellExecuteExW(&sei); } if (!is_register) return shellExt.UnRegisterDllProc() == S_OK ? TRUE : FALSE; int flags = SHEXT_MENU_DEFAULT; if ((shellExt.GetMenuFlagsProc() & SHEXT_MENUFLG_EX)) { flags |= SHEXT_ISSTOREOPT; if (cfg->shextNoConfirm) flags |= SHEXT_NOCONFIRM; else flags &= ~SHEXT_NOCONFIRM; if (cfg->shextNoConfirmDel) flags |= SHEXT_NOCONFIRMDEL; else flags &= ~SHEXT_NOCONFIRMDEL; if (cfg->shextTaskTray) flags |= SHEXT_TASKTRAY; else flags &= ~SHEXT_TASKTRAY; if (cfg->shextAutoClose) flags |= SHEXT_AUTOCLOSE; else flags &= ~SHEXT_AUTOCLOSE; } else { // for old shell ext flags &= ~SHEXT_MENUFLG_EX; } if (!IsDlgButtonChecked(RIGHT_COPY_CHECK)) flags &= ~SHEXT_RIGHT_COPY; if (!IsDlgButtonChecked(RIGHT_DELETE_CHECK)) flags &= ~SHEXT_RIGHT_DELETE; if (!IsDlgButtonChecked(RIGHT_PASTE_CHECK)) flags &= ~SHEXT_RIGHT_PASTE; if (!IsDlgButtonChecked(DD_COPY_CHECK)) flags &= ~SHEXT_DD_COPY; if (!IsDlgButtonChecked(DD_MOVE_CHECK)) flags &= ~SHEXT_DD_MOVE; if (IsDlgButtonChecked(RIGHT_SUBMENU_CHECK)) flags |= SHEXT_SUBMENU_RIGHT; if (IsDlgButtonChecked(DD_SUBMENU_CHECK)) flags |= SHEXT_SUBMENU_DD; if (shellExt.RegisterDllProc() != S_OK) return FALSE; return shellExt.SetMenuFlagsProc(flags); }