int32 OpenLiveBrowser(ExtensionString argURL, bool enableRemoteDebugging) { std::wstring appPath = GetPathToLiveBrowser(); std::wstring args = appPath; if (enableRemoteDebugging) args += L" --remote-debugging-port=9222 --allow-file-access-from-files "; else args += L" "; args += argURL; // Args must be mutable int argsBufSize = args.length() +1; std::auto_ptr<WCHAR> argsBuf( new WCHAR[argsBufSize]); wcscpy(argsBuf.get(), args.c_str()); STARTUPINFO si = {0}; si.cb = sizeof(si); PROCESS_INFORMATION pi = {0}; //Send the whole command in through the args param. Windows will parse the first token up to a space //as the processes and feed the rest in as the argument string. if (!CreateProcess(NULL, argsBuf.get(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { return ConvertWinErrorCode(GetLastError()); } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return NO_ERROR; }
ExecuteThread::ExecuteThread(const char *executable, const char *args /* = NULL */, const char *directory /* = NULL */) : Thread(0, NULL, false) { SHELLEXECUTEINFO shl; dMemset(&shl, 0, sizeof(shl)); shl.cbSize = sizeof(shl); shl.fMask = SEE_MASK_NOCLOSEPROCESS; char exeBuf[1024]; Platform::makeFullPathName(executable, exeBuf, sizeof(exeBuf)); TempAlloc< TCHAR > dirBuf( ( directory ? dStrlen( directory ) : 0 ) + 1 ); dirBuf[ dirBuf.size - 1 ] = 0; #ifdef UNICODE WCHAR exe[ 1024 ]; convertUTF8toUTF16( exeBuf, exe, sizeof( exe ) / sizeof( exe[ 0 ] ) ); TempAlloc< WCHAR > argsBuf( ( args ? dStrlen( args ) : 0 ) + 1 ); argsBuf[ argsBuf.size - 1 ] = 0; if( args ) convertUTF8toUTF16( args, argsBuf, argsBuf.size ); if( directory ) convertUTF8toUTF16( directory, dirBuf, dirBuf.size ); #else char* exe = exeBuf; char* argsBuf = args; if( directory ) dStrpcy( dirBuf, directory ); #endif backslash( exe ); backslash( dirBuf ); shl.lpVerb = TEXT( "open" ); shl.lpFile = exe; shl.lpParameters = argsBuf; shl.lpDirectory = dirBuf; shl.nShow = SW_SHOWNORMAL; if(ShellExecuteEx(&shl) && shl.hProcess) { mProcess = shl.hProcess; start(); } }