bool Ghostscript::Install(HWND hwnd,MSGFUNC &msgfunc){ m_installresult = false; if(!m_doinst)return true; if(!m_downloadresult)return false; ablib::string file = g_Setting.GetDownloadDir() + m_file.file; boost::filesystem::path path(file); CProgressBarCtrl progress_bar(::GetDlgItem(hwnd,IDC_PROGRESS)); static const int PROGRESSBAR_MAX = 32768; if(file.length() < 4 || file.substr(file.length() - 4) != _T(".exe")){ ::MessageBox(hwnd,_TR("古い Ghostscript を発見しました.このバージョンには対応していません."),_T("abtlinst"),0); return false; } ablib::system::Process process; ablib::system::Process::ProcessStartInfo s; ablib::string gsdir; gsdir = g_Setting.GetInstallDir() + _T("gs"); if(m_version != 0){ ablib::string ver = boost::lexical_cast<ablib::string>(m_version); // 後ろから二つおきにピリオドを挿入 ablib::string::size_type start = (ver.length() % 2); int len = ver.length(); for(ablib::string::size_type i = 0 ; i < len/2 ; ++i){ ver.insert(start + 3*i,_T(".")); } gsdir += _T("\\gs") + ver; } s.Arguments = _T("\"") + file + _T("\" /S /D=") + gsdir; // s.Arguments = _T("\"") + file + _T("\" /D=") + g_Setting.GetInstallDir() + _T("gs"); // s.Arg = _T("\"") + file + _T("\""); s.FileName = _T(""); s.WorkingDirectory = path.parent_path().wstring(); s.RedirectStandardError = false; s.RedirectStandardOutput = false; s.RedirectStandardInput = false; s.ShowState = ablib::system::Process::ProcessStartInfo::show; s.CreateNoWindow = false; process.StartInfo(s); CheckandSetTmp(g_Setting.GetTmpDir().c_str()); msgfunc.msg(_T("Ghostscript のインストール\n")); msgfunc.detail(_T("Ghostscript をインストール中\n")); if(!process.Start()){ g_Setting.Log(file + _T(" の起動に失敗")); return false; }else{ process.WaitForExit(); } progress_bar.SetPos(PROGRESSBAR_MAX/2); gsdir += _T("\\"); // ablib::string gsdir = GetGSDir(); if(g_Setting.SetPath()){ if(gsdir != _T("")){ g_Path.AddPath(gsdir + _T("bin")); g_Path.AddPath(gsdir + _T("lib")); }else g_Setting.Log(_TR("Ghostscript のインストールパス取得に失敗したので,PATH の設定を行いません")); } msgfunc.detail(_T("cidfmap の生成\n")); LPITEMIDLIST id; LPMALLOC mal; TCHAR fontdir[4096]; if( FAILED(::SHGetMalloc(&mal)) || FAILED(::SHGetSpecialFolderLocation(NULL,CSIDL_FONTS,&id)) || !::SHGetPathFromIDList(id,fontdir) ){ g_Setting.Log(_T("cidfmap の生成に失敗(フォントフォルダの取得に失敗).")); return false; } mal->Free(id); if(fontdir[::lstrlen(fontdir) - 1] != '\\')::lstrcat(fontdir,_T("\\")); ablib::string arg = ablib::string(_T("-q -dBATCH -sFONTDIR=")) + fontdir + _T(" -sCIDFMAP=") + gsdir + _T("lib\\cidfmap") + _T(" ") + gsdir + _T("lib\\mkcidfm.ps"); arg.replace(_T("\\"),_T("/")); s.Arguments = _T("\"") + gsdir + _T("\\bin\\gswin32c.exe\" ") + arg; s.WorkingDirectory = gsdir + _T("\\bin"); process.StartInfo(s); if(!process.Start()){ g_Setting.Log(s.Arguments + _T(" の実行に失敗")); return false; }else{ process.WaitForExit(); } progress_bar.SetPos(PROGRESSBAR_MAX); m_installresult = true; return true; }