现在的位置: 首页 > 综合 > 正文

自定义CMD&console显示

2018年06月06日 ⁄ 综合 ⁄ 共 1382字 ⁄ 字号 评论关闭

本文着重解决3个问题:

1 类似cmd的功能

2 同时执行执行多命令:“cmd /k + 命令”

3 重定向console的输出,以达到利用console来显示操作信息的目的。

存在bug:执行命令时,点console屏幕右上角关闭,会导致程序出错。

此处偷懒,就没有只是假设发送命令:cd D:

通过argv参数,则可以实现类似cmd的扩展功能。

bool g_bIsRun = false;

void runcmd(CString cmd, char *buf, unsigned int bufsize, unsigned int delay);


int main()
{
	int delay = 0;
	char szCmd[1024] = {0};
	char *pszBuf = NULL;
	pszBuf = (char *)calloc(10240,sizeof(char));

	if(!g_bIsRun)
	{
		g_bIsRun = true;
		AllocConsole();
		freopen("CONOUT$","w+t",stdout);
		freopen("CONIN$","r+t",stdin);
	}

	sprintf(szCmd,"cd D:");	
	runcmd(szCmd, pszBuf, 10240, delay);

	if(pszBuf != NULL)
		delete [] pszBuf;
	
	if(g_bIsRun)
		FreeConsole();

	return 0;
}

void runcmd(CString cmd, char *buf, unsigned int bufsize, unsigned int delay)
{
	SECURITY_ATTRIBUTES sa;
	HANDLE hRead, hWrite;
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;
	sa.bInheritHandle = TRUE;

	if (!CreatePipe(&hRead, &hWrite, &sa, 0)) 
	{
		printf("创建通讯管道失败\n");
		return;
	}

	STARTUPINFO si;
	PROCESS_INFORMATION pi;


	si.cb = sizeof(STARTUPINFO);
	GetStartupInfo(&si);
	si.hStdError = hWrite;
	si.hStdOutput = hWrite;
	si.wShowWindow = SW_HIDE;
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
	if (!CreateProcess(NULL, (LPTSTR)(LPCTSTR)cmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) 
	{
		printf("启动进程失败\n");
		return;
	}
	CloseHandle(hWrite);


	DWORD bytesRead;
	DWORD dwFlg = NULL;
	do{
		memset(buf, 0, bufsize);
		dwFlg = WaitForSingleObject(pi.hProcess, 300);
		ReadFile(hRead, buf, bufsize, &bytesRead, NULL);
		printf(buf);
	}while(dwFlg == WAIT_TIMEOUT);
	
	CloseHandle(hRead);
	return;
}

抱歉!评论已关闭.