bool start(ttstr const &target, const tjs_char *param=0, const tjs_char *folder=0) { if (hasError()) return false; ttstr cmd(L"\""); // 吉里吉里サーチパス上にある場合はそちらを優先 if (TVPIsExistentStorage(target)) { ttstr tmp = TVPGetPlacedPath(target); TVPGetLocalName(tmp); /**/cmd += tmp + L"\""; } else cmd += target + L"\""; if (param && wcslen(param) > 0) cmd += L" " + ttstr(param); LPWSTR cmdline = (LPWSTR)cmd.c_str(); // 子プロセス作成 STARTUPINFO si; ::ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.hStdOutput = hOW; si.hStdInput = hIR; si.hStdError = hEW; si.wShowWindow = SW_HIDE; if (!::CreateProcessW(0, cmdline, 0, 0, TRUE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP, 0, folder, &si, &pi)) { error = ERR_PROC; return false; } return true; }
/** * PSD画像のロード * @param filename ファイル名 * @return ロードに成功したら true */ bool PSD::load(ttstr filename) { ttstr file = TVPGetPlacedPath(filename); if (!file.length()) { // 見つからなかったのでローカルパスとみなして読み込む psd::PSDFile::load(NarrowString(filename)); } else { #ifdef LOAD_MEMORY if (!wcschr(file.c_str(), '>')) { // ローカルファイルなので直接読み込む TVPGetLocalName(file); psd::PSDFile::load(NarrowString(file)); } else { // メモリに読み込んでロード loadMemory(file); } #else // ストリームとしてロード loadStream(file); #endif } if (isLoaded) { addToStorage(filename); } return isLoaded; }
/** * プロセスの実行 * @param target ターゲット * @praam param パラメータ * @param folder フォルダ */ bool _execute(ttstr target, const tjs_char *param, const tjs_char *folder) { terminate(); ttstr cmd(L"\""); // 吉里吉里サーチパス上にある場合はそちらを優先 if (TVPIsExistentStorage(target)) { ttstr tmp = TVPGetPlacedPath(target); TVPGetLocalName(tmp); /**/cmd += tmp + L"\""; } else cmd += target + L"\""; SHELLEXECUTEINFO si; ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.lpVerb = _T("open"); si.lpFile = cmd.c_str(); si.lpParameters = param; si.lpDirectory = folder; si.nShow = SW_SHOWNORMAL; si.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS; if (ShellExecuteEx(&si)) { if (_beginthread(waitExecute, 0, new ExecuteInfo(msgHWND, si.hProcess)) != -1L) { process = si.hProcess; return true; } } return false; }
//--------------------------------------------------------------------------- void __fastcall TTVPMainForm::CreateMessageMapFileMenuItemClick( TObject *Sender) { try { ttstr fn = TVPGetAppPath() + TJS_W("msgmap.tjs"); TVPGetLocalName(fn); MessageMapFileSaveDialog->FileName = fn.AsAnsiString(); } catch(...) { MessageMapFileSaveDialog->FileName = "msgmap.tjs"; } if(MessageMapFileSaveDialog->Execute()) { TVPCreateMessageMapFile(MessageMapFileSaveDialog->FileName); } }
//--------------------------------------------------------------------------- bool TVPSelectFile(iTJSDispatch2 *params) { // show open dialog box // NOTE: currently this only shows ANSI version of file open dialog. tTJSVariant val; char * filter = NULL; char * filename = NULL; AnsiString initialdir; AnsiString title; AnsiString defaultext; BOOL result; try { // prepare OPENFILENAME structure OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = TVPGetModalWindowOwnerHandle(); ofn.hInstance = NULL; // set application window position to current window position // get filter ofn.lpstrFilter = NULL; if(TJS_SUCCEEDED(params->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("filter"), 0, &val, params))) { std::vector<AnsiString> filterlist; if(val.Type() != tvtObject) { TVPPushFilterPair(filterlist, ttstr(val).AsAnsiString()); } else { iTJSDispatch2 * array = val.AsObjectNoAddRef(); tjs_int count; tTJSVariant tmp; if(TJS_SUCCEEDED(array->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("count"), 0, &tmp, array))) count = tmp; else count = 0; for(tjs_int i = 0; i < count; i++) { if(TJS_SUCCEEDED(array->PropGetByNum(TJS_MEMBERMUSTEXIST, i, &tmp, array))) { TVPPushFilterPair(filterlist, ttstr(tmp).AsAnsiString()); } } } // create filter buffer tjs_int bufsize = 2; for(std::vector<AnsiString>::iterator i = filterlist.begin(); i != filterlist.end(); i++) { bufsize += i->Length() + 1; } filter = new char[bufsize]; char *p = filter; for(std::vector<AnsiString>::iterator i = filterlist.begin(); i != filterlist.end(); i++) { strcpy(p, i->c_str()); p += i->Length() + 1; } *(p++) = 0; *(p++) = 0; ofn.lpstrFilter = filter; } ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; if(TJS_SUCCEEDED(params->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("filterIndex"), 0, &val, params))) ofn.nFilterIndex = (tjs_int)val; else ofn.nFilterIndex = 0; // filenames filename = new char [MAX_PATH + 1]; filename[0] = 0; if(TJS_SUCCEEDED(params->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("name"), 0, &val, params))) { ttstr lname(val); if(!lname.IsEmpty()) { lname = TVPNormalizeStorageName(lname); TVPGetLocalName(lname); AnsiString name = lname.AsAnsiString(); strncpy(filename, name.c_str(), MAX_PATH); filename[MAX_PATH] = 0; } } ofn.lpstrFile = filename; ofn.nMaxFile = MAX_PATH + 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; // initial dir ofn.lpstrInitialDir = NULL; if(TJS_SUCCEEDED(params->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("initialDir"), 0, &val, params))) { ttstr lname(val); if(!lname.IsEmpty()) { lname = TVPNormalizeStorageName(lname); TVPGetLocalName(lname); initialdir = lname.AsAnsiString(); ofn.lpstrInitialDir = initialdir.c_str(); } } // title if(TJS_SUCCEEDED(params->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("title"), 0, &val, params))) { title = ttstr(val).AsAnsiString(); ofn.lpstrTitle = title.c_str(); } else { ofn.lpstrTitle = NULL; } // flags bool issave = false; if(TJS_SUCCEEDED(params->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("save"), 0, &val, params))) issave = val.operator bool(); ofn.Flags = OFN_ENABLEHOOK|OFN_EXPLORER|OFN_NOCHANGEDIR| OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_ENABLESIZING; if(!issave) ofn.Flags |= OFN_FILEMUSTEXIST; else ofn.Flags |= OFN_OVERWRITEPROMPT; // default extension if(TJS_SUCCEEDED(params->PropGet(TJS_MEMBERMUSTEXIST, TJS_W("defaultExt"), 0, &val, params))) { defaultext = ttstr(val).AsAnsiString(); ofn.lpstrDefExt = defaultext.c_str(); } else { ofn.lpstrDefExt = NULL; } // hook proc ofn.lpfnHook = TVPOFNHookProc; // show dialog box if(!issave) result = GetOpenFileName(&ofn); else result = GetSaveFileName(&ofn); if(!result && CommDlgExtendedError() == CDERR_STRUCTSIZE) { // for old windows // set lStructSize to old Windows' structure size ofn.lStructSize = TVP_OLD_OFN_STRUCT_SIZE; if(!issave) result = GetOpenFileName(&ofn); else result = GetSaveFileName(&ofn); } if(result) { // returns some informations // filter index val = (tjs_int)ofn.nFilterIndex; params->PropSet(TJS_MEMBERENSURE, TJS_W("filterIndex"), 0, &val, params); // file name val = TVPNormalizeStorageName(ttstr(filename)); params->PropSet(TJS_MEMBERENSURE, TJS_W("name"), 0, &val, params); } } catch(...) { if(filter) delete [] filter; if(filename) delete [] filename; throw; } delete [] filter; delete [] filename; return (bool)result; }
/** * AVIファイルを開く * @param filename 保存ファイル名 * @param fps 秒間フレーム数 */ void openAVI(const tjs_char *filename, int fps) { closeAVI(); // 録画開始時のサイズを記録しておく aviWidth = _width; aviHeight = _height; // AVIファイルを開く ttstr path = TVPNormalizeStorageName(ttstr(filename)); TVPGetLocalName(path); if (AVIFileOpen(&pavi, path.c_str(), OF_CREATE | OF_WRITE | OF_SHARE_DENY_NONE,NULL) != 0) { ttstr msg = filename; msg += ":can't open"; TVPThrowExceptionMessage(msg.c_str()); } // AVIストリームの生成 AVISTREAMINFO si = { streamtypeVIDEO, // Video Stream comptypeDIB, 0, // Stream Flag 0, 0, 0, 1, // 時間単位 dwScale fps, // フレーム dwRate 0, 0, // ストリームの長さ XXX 0, 0, (DWORD)-1, // -1: Default品質 [0-10000] 0, // 表示する矩形サイズ { 0, 0, aviWidth, aviHeight }, 0, 0, L"KIRIKIRI" }; if (AVIFileCreateStream(pavi, &pstm, &si) != 0) { closeAVI(); TVPThrowExceptionMessage(L"AVIFileCreateStream"); } // ストリームに投げ込むデータフォーマットを指定 BITMAPINFOHEADER bih; bih.biSize = sizeof(bih); bih.biWidth = aviWidth; bih.biHeight = aviHeight; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = 0; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; if (AVIStreamSetFormat(pstm, 0, &bih, sizeof(bih)) != 0 ) { closeAVI(); TVPThrowExceptionMessage(L"AVIFileCreateStream"); } // 先頭フレーム lastFrame = -1; hasCv = false; }
/** * AVIファイルを圧縮フォーマットを指定して開く * @param filename 保存ファイル名 * @param fps 秒間フレーム数 * @param return 圧縮ダイアログでキャンセルを押した場合false。 */ bool openCompressedAVI(const tjs_char *filename, int fps) { closeAVI(); // 録画開始時のサイズを記録しておく aviWidth = _width; aviHeight = _height; // ストリームに投げ込むデータフォーマットを指定 BITMAPINFOHEADER bih; bih.biSize = sizeof(bih); bih.biWidth = aviWidth; bih.biHeight = aviHeight; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = 0; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; // 圧縮オプションを取得 memset(&cv,0,sizeof(COMPVARS)); cv.cbSize=sizeof(COMPVARS); cv.dwFlags=ICMF_COMPVARS_VALID; cv.fccHandler=comptypeDIB; cv.lQ=ICQUALITY_DEFAULT; if (!ICCompressorChoose(NULL,ICMF_CHOOSE_DATARATE | ICMF_CHOOSE_KEYFRAME, &bih,NULL,&cv,NULL)) { return false; } // オプションを指定 opt.fccType=streamtypeVIDEO; opt.fccHandler=cv.fccHandler; opt.dwKeyFrameEvery=cv.lKey; opt.dwQuality=cv.lQ; opt.dwBytesPerSecond=cv.lDataRate; opt.dwFlags=(cv.lDataRate>0?AVICOMPRESSF_DATARATE:0) |(cv.lKey>0?AVICOMPRESSF_KEYFRAMES:0); opt.lpFormat=NULL; opt.cbFormat=0; opt.lpParms=cv.lpState; opt.cbParms=cv.cbState; opt.dwInterleaveEvery=0; // AVIファイルを開く ttstr path = TVPNormalizeStorageName(ttstr(filename)); TVPGetLocalName(path); if (AVIFileOpen(&pavi, path.c_str(), OF_CREATE | OF_WRITE | OF_SHARE_DENY_NONE,NULL) != 0) { ttstr msg = filename; msg += ":can't open"; TVPThrowExceptionMessage(msg.c_str()); } // AVIストリームの生成 AVISTREAMINFO si = { streamtypeVIDEO, // Video Stream comptypeDIB, 0, // Stream Flag 0, 0, 0, 1, // 時間単位 dwScale fps, // フレーム dwRate 0, 10, // ストリームの長さ XXX 0, 0, (DWORD)-1, // -1: Default品質 [0-10000] 0, // 表示する矩形サイズ { 0, 0, aviWidth, aviHeight }, 0, 0, L"KIRIKIRI" }; si.fccHandler=cv.fccHandler; if (AVIFileCreateStream(pavi, &pstm, &si) != 0) { closeAVI(); TVPThrowExceptionMessage(L"AVIFileCreateStream"); } if (AVIMakeCompressedStream(&ptmp,pstm,&opt,NULL)!=AVIERR_OK) { closeAVI(); TVPThrowExceptionMessage(L"AVIMakeCompressedStream"); } if (AVIStreamSetFormat(ptmp, 0, &bih, sizeof(bih)) != 0 ) { closeAVI(); TVPThrowExceptionMessage(L"AVIFileCreateStream"); } // 先頭フレーム lastFrame = -1; hasCv = true; return true; }