/* BrowseDlg用サブクラス生成 */ BOOL TBrowseDirDlg::AttachWnd(HWND _hWnd) { BOOL ret = TSubClass::AttachWnd(_hWnd); dirtyFlg = FALSE; // ディレクトリ設定 DWORD attr = GetFileAttributesU8(fileBuf); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) GetParentDirU8(fileBuf, fileBuf); SendMessageW(BFFM_SETSELECTIONW, TRUE, (LPARAM)U8toWs(fileBuf)); SetWindowText(IPMSG_FULLNAME); // ボタン作成 RECT tmp_rect; ::GetWindowRect(GetDlgItem(IDOK), &tmp_rect); POINT pt = { tmp_rect.left, tmp_rect.top }; ::ScreenToClient(hWnd, &pt); int cx = (pt.x - 30) / 2, cy = tmp_rect.bottom - tmp_rect.top; ::CreateWindowU8(BUTTON_CLASS, GetLoadStrU8(IDS_MKDIR), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 10, pt.y, cx, cy, hWnd, (HMENU)MKDIR_BUTTON, TApp::GetInstance(), NULL); ::CreateWindowU8(BUTTON_CLASS, GetLoadStrU8(IDS_RMDIR), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 18 + cx, pt.y, cx, cy, hWnd, (HMENU)RMDIR_BUTTON, TApp::GetInstance(), NULL); HFONT hDlgFont = (HFONT)SendDlgItemMessage(IDOK, WM_GETFONT, 0, 0L); if (hDlgFont) { SendDlgItemMessage(MKDIR_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L); SendDlgItemMessage(RMDIR_BUTTON, WM_SETFONT, (UINT)hDlgFont, 0L); } return ret; }
BOOL LogMng::IsLogDbExists() { char path[MAX_PATH_U8]; if (!LogToDbName(logFile, path, isAlt)) { return FALSE; } return GetFileAttributesU8(path) != 0xffffffff ? TRUE : FALSE; }
BOOL GetFileInfomationU8(const char *path, WIN32_FIND_DATA_U8 *fdata) { HANDLE fh; if ((fh = FindFirstFileU8(path, fdata)) != INVALID_HANDLE_VALUE) { ::FindClose(fh); return TRUE; } if ((fh = CreateFileU8(path, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) != INVALID_HANDLE_VALUE) { BY_HANDLE_FILE_INFORMATION info; BOOL info_ret = ::GetFileInformationByHandle(fh, &info); ::CloseHandle(fh); if (info_ret) { memcpy(fdata, &info, (char *)&info.dwVolumeSerialNumber - (char *)&info); return TRUE; } } return (fdata->dwFileAttributes = GetFileAttributesU8(path)) == 0xffffffff ? FALSE : TRUE; }
int TSaveCommonDlg::Exec(void) { modalFlg = TRUE; char fname[MAX_BUF], last_dir[MAX_BUF], buf[MAX_BUF], *ext; // 最終保存ディレクトリが無くなっている場合、少しさかのぼる for (int i=0; i < 5; i++) { if (*cfg->lastSaveDir && GetFileAttributesU8(cfg->lastSaveDir) == 0xffffffff) if (!PathToDir(cfg->lastSaveDir, cfg->lastSaveDir)) break; } strcpy(last_dir, *cfg->lastSaveDir ? cfg->lastSaveDir : "."); while (1) { FileInfo *fileInfo = shareInfo->fileInfo[offset]; MakePath(fname, last_dir, fileInfo->Fname()); // ファイルダイアログ TApp::GetApp()->AddWin(this); BOOL ret = OpenFileDlg(parentWin, OpenFileDlg::NODEREF_SAVE, (LPOFNHOOKPROC)TApp::WinProc).Exec(fname, GetLoadStrU8(IDS_SAVEFILE), GetLoadStrAsFilterU8(IDS_OPENFILEALLFLTR), last_dir); TApp::GetApp()->DelWin(this); hWnd = NULL; if (!ret) return FALSE; // shortcut の場合は、リンク先に飛ぶ if (!isLinkFile && (ext = strrchr(fname, '.')) && stricmp(ext, ".lnk") == 0) { char arg[MAX_BUF]; if (ReadLinkU8(fname, last_dir, arg)) { if ((GetFileAttributesU8(last_dir) & FILE_ATTRIBUTE_DIRECTORY) == 0) GetParentDir(last_dir, last_dir); } continue; } fileInfo = shareInfo->fileInfo[offset]; PathToDir(fname, last_dir); ForcePathToFname(fname, fname); fileInfo->SetSelected(TRUE); // 上書き確認 for (int i=0; i < shareInfo->fileCnt; i++) { if (!shareInfo->fileInfo[i]->IsSelected()) continue; MakePath(buf, last_dir, offset == i ? fname : shareInfo->fileInfo[i]->Fname()); if (GetFileAttributesU8(buf) != 0xffffffff) { ret = parentWin->MessageBoxU8(GetLoadStrU8(IDS_OVERWRITE), GetLoadStrU8(IDS_ATTENTION), MB_OKCANCEL|MB_ICONEXCLAMATION); if (ret != IDOK) { for (int j=0; j < shareInfo->fileCnt; j++) shareInfo->fileInfo[j]->SetSelected(FALSE); } break; } } if (ret) { fileInfo->SetFname(fname); strcpy(cfg->lastSaveDir, last_dir); cfg->WriteRegistry(CFG_GENERAL); return TRUE; } } // not reach }
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; }