Добрый день. Пишу апдейтер для прог. Класс апдейтера встраивается в необходимое приложение (к примеру, назовем его test.exe), проверяет есть ли для этого приложения апдейты, если есть - скачивает их, запускает отдельную программу "updater.exe" (занимающиеся распихиванием скаченных файлов по нужным путям и запуском необходимых программ) параллельно грохая родительское приложение test.exe.
В конце процедуры апдейта возникает необходимость из файла update.exe перезаписать тот файл, который собственно и запускался в начале (test.exe) и запустить его (уже обновленный). И вот тут возникла некоторая непонятка.
код запуска
updater.exe из приложения
test.exe выглядит так:
bool dbUpdater::runupdater()
{
QString Dest=_updater_filename; //"Updater.exe"
QProcess file_run;
if(file_run.startDetached (Dest))
{
//все намано, апдейтер запущен грохаем родительский процесс
exit(0);
}
//Что-то пошло не так
return false;
}
В свою очередь в
updater.exeЕсть функция проверки, на случай если нам надо перезаписать процесс который еще занят кем-либо:
bool IsProcessRun( QString processName )
{
BOOL rProcessFound;
PROCESSENTRY32 uProcess;
HANDLE lSnapshot,myproc;
DWORD dwError;
register BOOL term;
lSnapshot=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,0);
uProcess.dwSize=sizeof(uProcess);
rProcessFound=Process32First(lSnapshot,&uProcess);
while(rProcessFound)
{
if(strcmp(uProcess.szExeFile,processName.toAscii().data())==0)
{
myproc=OpenProcess(SYNCHRONIZE, FALSE, uProcess.th32ProcessID);
if( myproc!=NULL ) {
WaitForSingleObject(myproc, INFINITE);
CloseHandle (myproc);
CloseHandle(lSnapshot);
return true;
}
}
rProcessFound=Process32Next(lSnapshot,&uProcess);
}
CloseHandle(lSnapshot);
return false;
}
И собственно функция перезаписи:
bool File_util::f_instal(QString filePath, QString fileName)
{
QString Dest;
QDir targetDir(filePath);
QFileInfo Dest_file_info(fileName);
if(!targetDir.exists(filePath)){
targetDir.mkpath ( filePath );
}
Dest=filePath+Dest_file_info.fileName();
int i=0; int j=0;
if(QFile::exists(Dest))
{
IsProcessRun(Dest_file_info.fileName());//:Ждем пока процесс не освободится
QFile::remove(Dest); //[b]Так не работает, хотя IsProcessRun честно ожидает пока процесс не освободится[/b]
// while(!QFile::remove(Dest)) //[b]Так срабатывает проходя цикл 2-3 раза.[/b]
// {
// Sleep(1);
// }
}
return QFile::copy (fileName,Dest);
}
Вопрос:
что я делаю не так? Что без этого цикла:
while(!QFile::remove(Dest)) //[b]Так срабатывает проходя цикл 2-3 раза.[/b]
{
Sleep(1);
}
У меня не пашет перезапись того файла (test.exe), который вызывает (updater.exe)?