ShellExecute(Handle,"open",("\\C:\\gzip.exe").c_str(),("-dfv "+ strGzFiles).c_str(), NULL,SW_SHOWNORMAL);
其中strGzFiles是含待解压的gz文件列表,形如"m1.gz m2.gz m3.gz"
程序没问题,但存在潜在bug是:
1,我无法知道ShellExecute何时返回? gzip一旦被调用就与我的主程序并行运行,但我主程序下面需要用到解压后的文件,所以必须等到ShellExecute返回。
2, 由于gzip.exe的限制,待解压的文件长度受限(大概最多80几个文件),由于受功能的制约不能使用通配符
请问各位有没有什么好办法,或者不用ShellExecute.但请务必写清楚些,谢绝一句话解决方案
7 个解决方案
#1
用CreateProcess.
#2
解压前
你的解压后的文件是否存在,如果不存在,你就可以在你的程序中用到解压后文件时,先判断这个文件是否存在即可;如果存在,那么你是不是可以根据它的文件时间来确定它是否为最新,这样你就可以判断是否完成解压了.
这只是我的想法,如果用FindWindow,CreateProcess,可以得到gzip.exe它是否运行。
你的解压后的文件是否存在,如果不存在,你就可以在你的程序中用到解压后文件时,先判断这个文件是否存在即可;如果存在,那么你是不是可以根据它的文件时间来确定它是否为最新,这样你就可以判断是否完成解压了.
这只是我的想法,如果用FindWindow,CreateProcess,可以得到gzip.exe它是否运行。
#3
关注!!!!!!!!
#4
先Mark一下,回头再帮你看。
#5
//运行文件
STARTUPINFO mystartupinfo;
memset(&mystartupinfo, 0, sizeof(STARTUPINFO));
mystartupinfo.cb = sizeof(STARTUPINFO);
mystartupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
mystartupinfo.wShowWindow=SW_HIDE;
//mystartupinfo.wShowWindow=SW_SHOWNORMAL;
PROCESS_INFORMATION myprocess_information;
//unsigned long s;
if (CreateProcess(NULL,exefile.c_str(),NULL,NULL,true,0,0,0,&mystartupinfo,&myprocess_information))
{
CloseHandle(myprocess_information.hThread);
WaitForSingleObject(myprocess_information.hProcess,INFINITE);
}
exefile是你以命令行执行程序时的字符串
如winrar c:\*.* d:\a.rar
以上是从我的程序时摘出来的,保证能用
STARTUPINFO mystartupinfo;
memset(&mystartupinfo, 0, sizeof(STARTUPINFO));
mystartupinfo.cb = sizeof(STARTUPINFO);
mystartupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
mystartupinfo.wShowWindow=SW_HIDE;
//mystartupinfo.wShowWindow=SW_SHOWNORMAL;
PROCESS_INFORMATION myprocess_information;
//unsigned long s;
if (CreateProcess(NULL,exefile.c_str(),NULL,NULL,true,0,0,0,&mystartupinfo,&myprocess_information))
{
CloseHandle(myprocess_information.hThread);
WaitForSingleObject(myprocess_information.hProcess,INFINITE);
}
exefile是你以命令行执行程序时的字符串
如winrar c:\*.* d:\a.rar
以上是从我的程序时摘出来的,保证能用
#6
调用gzip,我以前做的就是用system(...),缺点是要显示个dos的黑框。用CreateProcess就好了。
#7
many thanks to whitelion,当然还有别的热心回答的朋友。用whitelion的代码成功
#1
用CreateProcess.
#2
解压前
你的解压后的文件是否存在,如果不存在,你就可以在你的程序中用到解压后文件时,先判断这个文件是否存在即可;如果存在,那么你是不是可以根据它的文件时间来确定它是否为最新,这样你就可以判断是否完成解压了.
这只是我的想法,如果用FindWindow,CreateProcess,可以得到gzip.exe它是否运行。
你的解压后的文件是否存在,如果不存在,你就可以在你的程序中用到解压后文件时,先判断这个文件是否存在即可;如果存在,那么你是不是可以根据它的文件时间来确定它是否为最新,这样你就可以判断是否完成解压了.
这只是我的想法,如果用FindWindow,CreateProcess,可以得到gzip.exe它是否运行。
#3
关注!!!!!!!!
#4
先Mark一下,回头再帮你看。
#5
//运行文件
STARTUPINFO mystartupinfo;
memset(&mystartupinfo, 0, sizeof(STARTUPINFO));
mystartupinfo.cb = sizeof(STARTUPINFO);
mystartupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
mystartupinfo.wShowWindow=SW_HIDE;
//mystartupinfo.wShowWindow=SW_SHOWNORMAL;
PROCESS_INFORMATION myprocess_information;
//unsigned long s;
if (CreateProcess(NULL,exefile.c_str(),NULL,NULL,true,0,0,0,&mystartupinfo,&myprocess_information))
{
CloseHandle(myprocess_information.hThread);
WaitForSingleObject(myprocess_information.hProcess,INFINITE);
}
exefile是你以命令行执行程序时的字符串
如winrar c:\*.* d:\a.rar
以上是从我的程序时摘出来的,保证能用
STARTUPINFO mystartupinfo;
memset(&mystartupinfo, 0, sizeof(STARTUPINFO));
mystartupinfo.cb = sizeof(STARTUPINFO);
mystartupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
mystartupinfo.wShowWindow=SW_HIDE;
//mystartupinfo.wShowWindow=SW_SHOWNORMAL;
PROCESS_INFORMATION myprocess_information;
//unsigned long s;
if (CreateProcess(NULL,exefile.c_str(),NULL,NULL,true,0,0,0,&mystartupinfo,&myprocess_information))
{
CloseHandle(myprocess_information.hThread);
WaitForSingleObject(myprocess_information.hProcess,INFINITE);
}
exefile是你以命令行执行程序时的字符串
如winrar c:\*.* d:\a.rar
以上是从我的程序时摘出来的,保证能用
#6
调用gzip,我以前做的就是用system(...),缺点是要显示个dos的黑框。用CreateProcess就好了。
#7
many thanks to whitelion,当然还有别的热心回答的朋友。用whitelion的代码成功