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; }
//--------------------------------------------------------------------------- // TVPInitializeBaseSystems //--------------------------------------------------------------------------- void TVPInitializeBaseSystems() { // set system archive delimiter tTJSVariant v; if(TVPGetCommandLine(TJS_W("-arcdelim"), &v)) TVPArchiveDelimiter = ttstr(v)[0]; // set default current directory { char drive[MAXDRIVE]; char dir[MAXDIR]; fnsplit(_argv[0], drive, dir, NULL, NULL); ttstr curdir(ttstr(drive) + ttstr(dir)); if(curdir.GetLastChar() != TJS_W('\\')) curdir += TJS_W('\\'); TVPSetCurrentDirectory(curdir); } // load message map file bool load_msgmap = GetSystemSecurityOption("disablemsgmap") == 0; if(load_msgmap) { const tjs_char name_msgmap [] = TJS_W("msgmap.tjs"); if(TVPIsExistentStorage(name_msgmap)) TVPExecuteStorage(name_msgmap, NULL, false, TJS_W("")); } }
/** * プロセスの実行 * @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; }
// onLoaded( dic, is_async, is_error, error_mes ); エラーは // sync ( main thead ) void tTVPAsyncImageLoader::LoadRequest( iTJSDispatch2 *owner, tTJSNI_Bitmap* bmp, const ttstr &name ) { //tTVPBaseBitmap* dest = new tTVPBaseBitmap( 32, 32, 32 ); tTVPBaseBitmap dest( TVPGetInitialBitmap() ); iTJSDispatch2* metainfo = NULL; ttstr nname = TVPNormalizeStorageName(name); if( TVPCheckImageCache(nname,&dest,glmNormal,0,0,TVP_clNone,&metainfo) ) { // キャッシュ内に発見、即座に読込みを完了する bmp->CopyFrom( &dest ); bmp->SetLoading( false ); tTJSVariant param[4]; param[0] = tTJSVariant(metainfo,metainfo); if( metainfo ) metainfo->Release(); param[1] = 0; // false param[2] = 0; // false param[3] = TJS_W(""); // error_mes static ttstr eventname(TJS_W("onLoaded")); TVPPostEvent(owner, owner, eventname, 0, TVP_EPT_IMMEDIATE, 4, param); return; } if( TVPIsExistentStorage(name) == false ) { TVPThrowExceptionMessage(TVPCannotFindStorage, name); } ttstr ext = TVPExtractStorageExt(name); if(ext == TJS_W("")) { TVPThrowExceptionMessage(TJS_W("Filename extension not found/%1"), name); } PushLoadQueue( owner, bmp, nname ); }