⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cedtviewcommand.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		CString szVar0 = CString(pSave, pChar-pSave);
		CString szVar1 = bEnclosed ? CString(pSave+2, pChar-pSave-3) : CString(pSave+1, pChar-pSave-1);
		TRACE1("- Variable Found: '%s'\n", szVar0);

		CString szVar2 = szVar1, szExpn, szValu; INT nFound = -1;
		if( (nFound = szVar1.Find('=')) >= 0 ) { szVar2 = szVar1.Left(nFound); szExpn = szVar1.Mid(nFound); }
		if( (nFound = szVar1.Find(':')) >= 0 ) { szVar2 = szVar1.Left(nFound); szExpn = szVar1.Mid(nFound); }
		if( (nFound = szVar1.Find('#')) >= 0 ) { szVar2 = szVar1.Left(nFound); szExpn = szVar1.Mid(nFound); }
		if( (nFound = szVar1.Find('%')) >= 0 ) { szVar2 = szVar1.Left(nFound); szExpn = szVar1.Mid(nFound); }

		BOOL bFound = clsVariables.Lookup( szVar2, szValu );
		if( ! bFound ) szValu = getenv( szVar2 );
		TRACE2("- Original Value: '%s' -> '%s'\n", szVar2, szValu);

		if( szExpn.GetLength() ) ExpandShellVariable( szValu, szExpn );
		TRACE2("- Value Expanded: '%s' -> '%s'\n", szVar1, szValu);

		szArgu = szArgu.Left(pSave-pArgu) + szValu + szArgu.Mid(pChar-pArgu);
		pChar  = pArgu  = (TCHAR *)(LPCTSTR)szArgu;

		while( * pChar && * pChar != '$' ) pChar++;
	}

	TRACE1("ENDOF ReplaceShellVariables: %s\n", szArgu);
	return TRUE;
}

BOOL CCedtView::ExpandShellVariable(CString & szValue, LPCTSTR lpszExpand)
{
	INT nLength = szValue.GetLength();

	if( lpszExpand[0] == '=' ) { // assignment
		INT nExpand = strlen(lpszExpand+1);
		if( ! nLength && nExpand ) szValue = lpszExpand + 1;
	} else if( lpszExpand[0] == ':' ) { // substring
		TCHAR * pFound = strchr(lpszExpand+1, ',');
		INT nFirst = atoi( lpszExpand+1 ); if( nFirst > nLength ) nFirst = nLength;
		INT nCount = pFound ? atoi( pFound+1 ) : nLength-nFirst;
		szValue = szValue.Mid(nFirst, nCount);
	} else if( lpszExpand[0] == '#' ) { // beginning match delete
		INT nExpand = strlen(lpszExpand+1);
		if( nExpand && szValue.Find(lpszExpand+1) == 0 )
			szValue = szValue.Mid(nExpand);
	} else if( lpszExpand[0] == '%' ) { // trailing match delete
		INT nExpand = strlen(lpszExpand+1);
		if( nExpand && szValue.Find(lpszExpand+1) == nLength-nExpand )
			szValue = szValue.Left(nLength-nExpand);
	}

	return TRUE;
}

BOOL CCedtView::ExecuteWinHelp(LPCTSTR lpszCommand, LPCTSTR lpszArgument)
{
//	HWND hWnd = ::GetDesktopWindow(); -- changed to release input focus
	HWND hWnd = AfxGetMainWnd()->m_hWnd;

	return ::WinHelp( hWnd, lpszCommand, HELP_PARTIALKEY, (DWORD)lpszArgument );
}

BOOL CCedtView::ExecuteHtmlHelp(LPCTSTR lpszCommand, LPCTSTR lpszArgument)
{
	HH_AKLINK link; memset( & link, 0x00, sizeof(HH_AKLINK) );
	link.cbStruct = sizeof(HH_AKLINK);
	link.pszKeywords = lpszArgument;
	link.fIndexOnFail = TRUE;

	if( ! CCedtApp::m_bHtmlHelpInitialized ) {
		::HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&CCedtApp::m_dwHtmlHelpCookie);
		CCedtApp::m_bHtmlHelpInitialized = TRUE;
	} // HtmlHelp will be uninitialized in CCedtApp::ExitInstance()

//	HWND hWnd = ::GetDesktopWindow(); -- changed to release input forcus
	HWND hWnd = AfxGetMainWnd()->m_hWnd;

//	HWND hHlp = ::HtmlHelp( hWnd, lpszCommand, HH_DISPLAY_TOC, NULL);
	HWND hHlp = ::HtmlHelp( hWnd, lpszCommand, HH_KEYWORD_LOOKUP, (DWORD)(& link) );

	return hHlp ? TRUE : FALSE;
}

BOOL CCedtView::ExecuteExecutable(LPCTSTR lpszCommand, LPCTSTR lpszArgument, LPCTSTR lpszDirectory, BOOL bCloseOnExit, BOOL bCaptureOutput)
{
	TCHAR szCommandLine[2048];
	if( ! bCaptureOutput && ! bCloseOnExit ) {
		CString szLauncher = CCedtApp::m_szInstallDirectory + "\\launch.exe";
		CString szShortPath = GetShortPathName( lpszCommand );
		sprintf(szCommandLine, "\"%s\" %s %s", szLauncher, szShortPath, lpszArgument);
	} else {
		sprintf(szCommandLine, "\"%s\" %s", lpszCommand, lpszArgument);
	}

	HANDLE hChildStdinWr, hChildStdinRd;
	HANDLE hChildStdoutWr, hChildStdoutRd;
	if( bCaptureOutput ) { // create redirect pipe
		SECURITY_ATTRIBUTES saAttr; 
		saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
		saAttr.bInheritHandle = TRUE; 
		saAttr.lpSecurityDescriptor = NULL; 

		HANDLE hProcess = GetCurrentProcess();

		if( ! CreatePipe( & hChildStdinRd, & hChildStdinWr, & saAttr, 0 ) ) return FALSE;
 		if( ! DuplicateHandle(hProcess, hChildStdinWr, hProcess, & m_hChildStdinWrDup, 0, FALSE, DUPLICATE_SAME_ACCESS) ) return FALSE;
 		if( ! CloseHandle( hChildStdinWr ) ) return FALSE;

		if( ! CreatePipe( & hChildStdoutRd, & hChildStdoutWr, & saAttr, 0 ) ) return FALSE;
		if( ! DuplicateHandle(hProcess, hChildStdoutRd, hProcess, & m_hChildStdoutRdDup, 0, FALSE, DUPLICATE_SAME_ACCESS) ) return FALSE;
		if( ! CloseHandle( hChildStdoutRd ) ) return FALSE;
	}

	STARTUPINFO si; ZeroMemory( & si, sizeof(si) ); si.cb = sizeof(si);
	if( bCaptureOutput ) {
		si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
		si.wShowWindow = SW_HIDE;
		si.hStdInput = hChildStdinRd;
		si.hStdOutput = hChildStdoutWr;
		si.hStdError = hChildStdoutWr;
	} else {
		si.dwFlags = STARTF_USESHOWWINDOW;
		si.wShowWindow = SW_SHOWNORMAL;
	}

	LPCTSTR lpCurrentDirectory = NULL;
	if( strlen(lpszDirectory) ) lpCurrentDirectory = lpszDirectory;

	PROCESS_INFORMATION pi; ZeroMemory( & pi, sizeof(pi) );
	BOOL bResult = ::CreateProcess( NULL, szCommandLine, NULL, NULL, TRUE, 0, NULL, lpCurrentDirectory, & si, & pi);

	m_hChildProcess = pi.hProcess;
	m_hChildThread = pi.hThread;

	if( bCaptureOutput ) {
		if( ! CloseHandle(hChildStdinRd) ) return FALSE;
		if( ! CloseHandle(hChildStdoutWr) ) return FALSE;

		CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd();
		if( ! pFrame->IsOutputWindowVisible() ) pFrame->ShowOutputWindow(TRUE);

		pFrame->SetOutputWindowOccupied(TRUE);
		pFrame->EnableOutputWindowInput(TRUE);

		pFrame->ClearOutputWindowContents();

		CString szMessage; szMessage.LoadString(IDS_OUT_COMMAND_TITLE);
		pFrame->AddStringToOutputWindow( szMessage );

		szMessage.Format(IDS_OUT_COMMAND_COMMAND, szCommandLine);
		pFrame->AddStringToOutputWindow( szMessage );

		m_bChildOutputLineContinue = FALSE;
		m_arrChildInputString.RemoveAll();

		SetTimer( ID_TIMER_CAPTURE_OUTPUT, 100, NULL );
	}

	return bResult;
}

void CCedtView::OnTimerCaptureOutput()
{
	static DWORD dwSave = 0; 
	static TCHAR szReadBuffer[4096], szWriteBuffer[4096];

	BOOL bResult; DWORD dwExitCode = 0;
	bResult = GetExitCodeProcess( m_hChildProcess, & dwExitCode );

	while( dwExitCode == STILL_ACTIVE && m_arrChildInputString.GetSize() ) {
		CString & szChildInputString = m_arrChildInputString.ElementAt(0);
		DWORD dwWritten, dwWrite = szChildInputString.GetLength();

		strcpy( szWriteBuffer, szChildInputString );
		szWriteBuffer[dwWrite] = '\n'; szWriteBuffer[dwWrite+1] = '\0';

		bResult = WriteFile( m_hChildStdinWrDup, szWriteBuffer, dwWrite+1, & dwWritten, NULL );
	//	bResult = FlushFileBuffers( m_hChildStdinWrDup ); -- flush will hang the child process

		// copy input string to output buffer for echo effect
		strcpy( szReadBuffer + dwSave, szWriteBuffer ); dwSave += dwWrite + 1;

		INT nArraySize = m_arrChildInputString.GetSize();
		m_arrChildInputString.RemoveAt( nArraySize - 1 );
	}

	DWORD dwAvail = 0, dwRead = 0;
	if( dwExitCode == STILL_ACTIVE ) {
		bResult = PeekNamedPipe( m_hChildStdoutRdDup, NULL, 0, NULL, & dwAvail, NULL );
		if( dwAvail ) {
			bResult = ReadFile( m_hChildStdoutRdDup, szReadBuffer + dwSave, dwAvail, & dwRead, NULL );
			dwSave += dwRead; szReadBuffer[dwSave] = '\0';
		}
	} else {
		bResult = ReadFile( m_hChildStdoutRdDup, szReadBuffer + dwSave, 4096 - dwSave, & dwRead, NULL );
		dwSave += dwRead; szReadBuffer[dwSave] = '\0';
		if( dwSave ) {
			dwSave++; szReadBuffer[dwSave] = '\0';
		}
	}

	DWORD i = 0, j = 0;
	while( i < dwSave ) {
		if( szReadBuffer[i] != '\n' ) { i++; continue; }

		if( i > 0 && szReadBuffer[i-1] == '\r' ) szReadBuffer[i-1] = '\0';
		else szReadBuffer[i] = '\0';

		CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd();
		if( m_bChildOutputLineContinue ) {
			CString szCompleteLine; pFrame->GetStringOfOutputWindow( szCompleteLine );
			szCompleteLine += szReadBuffer;

			pFrame->ReplaceStringOfOutputWindow( szCompleteLine );
			m_bChildOutputLineContinue = FALSE;
		} else {
			pFrame->AddStringToOutputWindow( szReadBuffer );
		}

		for( j = i + 1; j <= dwSave; j++ ) szReadBuffer[j-i-1] = szReadBuffer[j];
		dwSave = dwSave - (i + 1); i = 0;
	}

	if( i = dwSave ) {
		if( i > 0 && szReadBuffer[i-1] == '\r' ) szReadBuffer[i-1] = '\0';
		else szReadBuffer[i] = '\0';

		CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd();
		pFrame->AddStringToOutputWindow( szReadBuffer );

		dwSave = 0; szReadBuffer[0] = '\0';
		m_bChildOutputLineContinue = TRUE;
	}

	if( dwExitCode != STILL_ACTIVE ) {
		KillTimer( ID_TIMER_CAPTURE_OUTPUT );

		CloseHandle(m_hChildStdinWrDup);
		CloseHandle(m_hChildStdoutRdDup);
		m_hChildStdinWrDup = m_hChildStdoutRdDup = NULL;

		dwSave = 0;
		szReadBuffer[dwSave] = '\0';

		CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd();

		CString szMessage; szMessage.Format(IDS_OUT_COMMAND_TERMINATED, dwExitCode);
		pFrame->AddStringToOutputWindow( szMessage );

		pFrame->SetOutputWindowOccupied(FALSE);
		pFrame->EnableOutputWindowInput(FALSE);

		CCedtApp * pApp = (CCedtApp *)AfxGetApp();
		pApp->CheckIfFilesModifiedOutside();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -