MFC调用CMD命令时,能否不弹出控制台黑框?

凌乱哥 2014-03-06 02:18:30
程序中调用了形如 system("xcopy ....."); 这样的,而且是多处调用
所以存在的问题是,控制台黑框会不断的弹出来,而且每次弹出的窗口位置还不同,导致做其他工作的焦点会被它抢掉,比如正在VS编辑代码,黑框出来之后VS就失去焦点了,影响其他的工作。有时这个程序的运行时间好几个小时,做其他事情的效率就大大降低

问诸位大侠有没有办法让他不弹出,或者其他解决方法?前提是用system的代码部分不修改
...全文
1169 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sc5201314 2016-07-11
  • 打赏
  • 举报
回复
引用 3 楼 dingxz105090 的回复:
[quote=引用 1 楼 xjtuzhw 的回复:] 参考这个 http://blog.csdn.net/wallaceli1981/article/details/6655287
按照那篇博客来,其中一句如果这样写

if   (!CreateProcess(NULL, _T("copy \"D:\\TestProject\\MyFunctions\\MyFunctions\\1.TXT\" \"D:\\TestProject\\MyFunctions\\MyFunctions\\Debug\\aaa.txt\""), NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
就会异常: Unhandled exception at 0x7c8309b9 in MyFunctions.exe: 0xC0000005: Access violation writing location 0x00431e80. 然后我改成

if   (!CreateProcess(_T("C:\\WINDOWS\\system32\\cmd.exe"), _T("copy \"D:\\TestProject\\MyFunctions\\MyFunctions\\1.TXT\" \"D:\\TestProject\\MyFunctions\\MyFunctions\\Debug\\aaa.txt\""), NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))     //
	{   
		return   FALSE;   
	}   
异常就没有了,而且也不会进到return FALSE;去,说明成功了,控制台也没出来,问题是,没有拷贝成功,何解? 命令行没有问题,我直接system("copy \"D:\\TestProject\\MyFunctions\\MyFunctions\\1.TXT\" \"D:\\TestProject\\MyFunctions\\MyFunctions\\Debug\\aaa.txt\"");是可以拷贝成功的[/quote] system() 相当于 cmd /c 你CreateProcess第二个参数应该加 /c 在 copy 前面. 另外 WinExec(cmdline,SW_HIDE); 就没有黑框框了 cmdline = "cmd.exe /c del xx.exe"; 类似这样 如果要等待拷贝结束 可以自己定义一个函数,像WaitProcess()这样的 void WaitProcess(LPTSTR FileName,LPTSTR Param) { SHELLEXECUTEINFO ShellInfo = {0}; ShellInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShellInfo.hwnd = 0; ShellInfo.lpVerb = 0; ShellInfo.lpFile = FileName; /////传入cmd.exe路径 ShellInfo.lpParameters = Param; //////传入 /c copy .... ShellInfo.lpDirectory = 0; ShellInfo.nShow = 0; ShellInfo.hInstApp = 0; ShellExecuteEx(&ShellInfo); WaitForSingleObject(ShellInfo.hProcess,-1); } 供后来人参考
凌乱哥 2014-09-22
  • 打赏
  • 举报
回复
引用 19 楼 xdong888 的回复:
遇到了同样的问题,可是system()中的不是CString吗,可是CreateProcess第二个参数是LPTSTR这个该如何解决?将CString强制转换成Char *还是没法正常执行system()中的命令啊
引用 20 楼 giepy 的回复:
楼主,跪求这个问题你是怎么解决的,求指导
试试一楼的吧,我反正没搞定,一直留着
giepy 2014-09-22
  • 打赏
  • 举报
回复
楼主,跪求这个问题你是怎么解决的,求指导
xdong888 2014-07-05
  • 打赏
  • 举报
回复
遇到了同样的问题,可是system()中的不是CString吗,可是CreateProcess第二个参数是LPTSTR这个该如何解决?将CString强制转换成Char *还是没法正常执行system()中的命令啊
会思考的草 2014-03-12
  • 打赏
  • 举报
回复
引用 楼主 dingxz105090 的回复:
程序中调用了形如 system("xcopy ....."); 这样的,而且是多处调用 所以存在的问题是,控制台黑框会不断的弹出来,而且每次弹出的窗口位置还不同,导致做其他工作的焦点会被它抢掉,比如正在VS编辑代码,黑框出来之后VS就失去焦点了,影响其他的工作。有时这个程序的运行时间好几个小时,做其他事情的效率就大大降低 问诸位大侠有没有办法让他不弹出,或者其他解决方法?前提是用system的代码部分不修改
CreateProcess然后使用管道重定向。
会魔法的小狗 2014-03-12
  • 打赏
  • 举报
回复
WinExec 加上 sw_hide参数, 可以简单解决。
lijunbiao2080 2014-03-11
  • 打赏
  • 举报
回复
SHELLEXECUTEINFO shellExeInfo; memset(&shellExeInfo, 0, sizeof(shellExeInfo)); shellExeInfo.cbSize = sizeof(SHELLEXECUTEINFO); shellExeInfo.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_DDEWAIT | 0x04000000 | SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE; shellExeInfo.lpVerb = "open"; shellExeInfo.hwnd = NULL; shellExeInfo.lpFile = "regsvr32.exe";//这个替换成你的复制命令 shellExeInfo.lpParameters = strVideoShortPath.c_str(); //这是你命令的参数 shellExeInfo.lpDirectory = NULL; shellExeInfo.nShow = SW_HIDE; shellExeInfo.hInstApp = NULL; ::ShellExecuteEx(&shellExeInfo); if(shellExeInfo.hProcess) { ::WaitForSingleObject(shellExeInfo.hProcess, INFINITE); }
ynwlgh 2014-03-11
  • 打赏
  • 举报
回复
用管道导向。
沈-军涛 2014-03-10
  • 打赏
  • 举报
回复
用递归调用CopyFile和CreateDirectory可好?
枫墨于心 2014-03-08
  • 打赏
  • 举报
回复
你调起了别的程序,要想控制它,就得hook他,否则没招
allenhiman 2014-03-07
  • 打赏
  • 举报
回复
createprocess无非是通过启动参数来执行命令 你先确认 用“运行”能达到效果再说 如果那样都不行 createprocess都不行
zwfgdlc 2014-03-06
  • 打赏
  • 举报
回复
	STARTUPINFO si  = {0};  
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;
  if   (!CreateProcess(_T("C:\\WINDOWS\\system32\\cmd.exe"), CommandLine, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
凌乱哥 2014-03-06
  • 打赏
  • 举报
回复
引用 8 楼 VisualEleven 的回复:
BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
第二个参数是LPTSTR,不是LPCTSTR
VS08的WinBase.h里是这样的:

WINBASEAPI
BOOL
WINAPI
CreateProcessW(
    __in_opt    LPCWSTR lpApplicationName,
    __inout_opt LPWSTR lpCommandLine,
    __in_opt    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    __in_opt    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    __in        BOOL bInheritHandles,
    __in        DWORD dwCreationFlags,
    __in_opt    LPVOID lpEnvironment,
    __in_opt    LPCWSTR lpCurrentDirectory,
    __in        LPSTARTUPINFOW lpStartupInfo,
    __out       LPPROCESS_INFORMATION lpProcessInformation
    );
然后我

system_hide(_T("copy ...."));

BOOL CMyFunctionsDlg::system_hide(TCHAR *CommandLine)
{
     if   (!CreateProcess(_T("C:\\WINDOWS\\system32\\cmd.exe"), CommandLine, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)).........
}

/////////////////////////////////
system_hide(_T("copy ...."));

BOOL CMyFunctionsDlg::system_hide(LPWSTR CommandLine)
{
     if   (!CreateProcess(_T("C:\\WINDOWS\\system32\\cmd.exe"), CommandLine, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)).........
}
都没成功,这应该怎样转
凌乱哥 2014-03-06
  • 打赏
  • 举报
回复
引用 7 楼 allenhiman 的回复:
如果你非要执行system命令 并且不想让cmd出窗口 估计得写个hook了 专门勾cmd的窗口创建 然后处理
1楼的方法貌似管用,只是现在又有新问题
Eleven 2014-03-06
  • 打赏
  • 举报
回复
BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
第二个参数是LPTSTR,不是LPCTSTR
allenhiman 2014-03-06
  • 打赏
  • 举报
回复
如果你非要执行system命令 并且不想让cmd出窗口 估计得写个hook了 专门勾cmd的窗口创建 然后处理
lx624909677 2014-03-06
  • 打赏
  • 举报
回复
可以,有方法能让那个黑窗口不闪的
allenhiman 2014-03-06
  • 打赏
  • 举报
回复
应该是不行吧 cmd的那些命令不是通过启动参数可以执行的
凌乱哥 2014-03-06
  • 打赏
  • 举报
回复
引用 2 楼 fq553165833 的回复:
牛逼啊!问这么高端大气的问题,果断摒弃system
我屮艸芔茻,惊现高富!!!
凌乱哥 2014-03-06
  • 打赏
  • 举报
回复
引用 1 楼 xjtuzhw 的回复:
参考这个 http://blog.csdn.net/wallaceli1981/article/details/6655287
按照那篇博客来,其中一句如果这样写

if   (!CreateProcess(NULL, _T("copy \"D:\\TestProject\\MyFunctions\\MyFunctions\\1.TXT\" \"D:\\TestProject\\MyFunctions\\MyFunctions\\Debug\\aaa.txt\""), NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
就会异常: Unhandled exception at 0x7c8309b9 in MyFunctions.exe: 0xC0000005: Access violation writing location 0x00431e80. 然后我改成

if   (!CreateProcess(_T("C:\\WINDOWS\\system32\\cmd.exe"), _T("copy \"D:\\TestProject\\MyFunctions\\MyFunctions\\1.TXT\" \"D:\\TestProject\\MyFunctions\\MyFunctions\\Debug\\aaa.txt\""), NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))     //
	{   
		return   FALSE;   
	}   
异常就没有了,而且也不会进到return FALSE;去,说明成功了,控制台也没出来,问题是,没有拷贝成功,何解? 命令行没有问题,我直接system("copy \"D:\\TestProject\\MyFunctions\\MyFunctions\\1.TXT\" \"D:\\TestProject\\MyFunctions\\MyFunctions\\Debug\\aaa.txt\"");是可以拷贝成功的
加载更多回复(2)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧