不食言,关于ShellExecute调用gzip的使用,只要是建设性意见马上给分

时间:2021-11-15 19:59:25
我得一个程序要解压*.gz文件,所以需要调用gzip.exe.目前我的方法是:
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它是否运行。

#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

以上是从我的程序时摘出来的,保证能用

#6


调用gzip,我以前做的就是用system(...),缺点是要显示个dos的黑框。用CreateProcess就好了。

#7


many thanks to whitelion,当然还有别的热心回答的朋友。用whitelion的代码成功

#1


用CreateProcess.

#2


解压前
你的解压后的文件是否存在,如果不存在,你就可以在你的程序中用到解压后文件时,先判断这个文件是否存在即可;如果存在,那么你是不是可以根据它的文件时间来确定它是否为最新,这样你就可以判断是否完成解压了.
这只是我的想法,如果用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

以上是从我的程序时摘出来的,保证能用

#6


调用gzip,我以前做的就是用system(...),缺点是要显示个dos的黑框。用CreateProcess就好了。

#7


many thanks to whitelion,当然还有别的热心回答的朋友。用whitelion的代码成功