📄 cedtviewcommand.cpp
字号:
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 + -