WaitForSingleObject и exit в QT приложениях
От: CMorgan  
Дата: 31.01.12 09:26
Оценка:
Добрый день. Пишу апдейтер для прог. Класс апдейтера встраивается в необходимое приложение (к примеру, назовем его 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();

    
    if(QFile::exists(Dest))
    {
        IsProcessRun(Dest_file_info.fileName());//:Ждем пока процесс не освободится
        
                QFile::remove(Dest); //Так не работает, хотя IsProcessRun честно ожидает пока процесс не освободится


//         while(!QFile::remove(Dest)) //Так срабатывает проходя цикл 1-3 раза.
//         {
//             Sleep(1);
//         }
        

    }
    return QFile::copy (fileName,Dest);

    
    
}


Вопрос: что я делаю не так? Что без этого цикла:
         while(!QFile::remove(Dest)) //Так срабатывает проходя цикл 2-3 раза.
         {
             Sleep(1);
         }

У меня не пашет перезапись того файла (test.exe), который вызывает (updater.exe)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.