OVH Cloud OVH Cloud

Remplacer l'exe courant sous 9X

4 réponses
Avatar
Thierry
J'ai une méthode qui marche avec les NT :
- MoveFile(PathExe, tempFile);
- CopyFile(PathNewExe, PathExe);

Sous 98 MoveFile foire (GetLastError = 5)
et CopyFile retourne 32 ("Le processus ne peut pas accéder au fichier car
ce fichier est utilisé par un autre processus.").

Une méthode pour 9X ?

--
« Le travail est probablement ce qu'il y a sur cette terre de plus bas et
de plus ignoble. Il n'est pas possible de regarder un travailleur sans
maudire ce qui a fait que cet homme travaille, alors qu'il pourrait nager,
dormir dans l'herbe ou simplement lire ou faire l'amour avec sa femme. »
Boris VIAN
>> Mon blog RSS : http://yarglah.free.fr/monblog_rss.php <<

4 réponses

Avatar
Remi Thomas
"Thierry" écrivit

J'ai une méthode qui marche avec les NT :
- MoveFile(PathExe, tempFile);
- CopyFile(PathNewExe, PathExe);

Sous 98 MoveFile foire (GetLastError = 5)
et CopyFile retourne 32 ("Le processus ne peut pas accéder au fichier car
ce fichier est utilisé par un autre processus.").

Une méthode pour 9X ?




Bonjour,

http://groups-beta.google.com/group/fr.comp.os.ms-windows.programmation/msg/26eecc05055dd58c?dmode=source&hl=en

Rémi
Avatar
Thierry
"Remi Thomas" écrivait
news:42a083bf$0$16165$:

http://groups-beta.google.com/group/fr.comp.os.ms-windows.programmation
/msg/26eecc05055dd58c?dmode=source&hl=en



Titre de la KB:
"Qui sont actuellement en cours d'utilisation, comment fichiers de
déplacement"
Misère...
Ca sert a rien de traduire si c'est pour avoir un truc imbitable.

Y'a pas d'autres solutions que le MoveFile avec le flag DELAY_REBOOT ?
Dommage de rebooter pour si peu.
Avatar
Bertrand Lenoir-Welter
Ce que je fais dans ce cas, c'est un mini-exécutable qui est appelé par
le programme à déplacer/effacer/etc. et qui se charge de l'opération
après une pause. Le programme appelant lui passe en argument le délai
avant d'opérer, le type d'opération, le nom du programme à effacer ou
déplacer (nom de la cible dans ce cas), et le nom du programme à appeler
à son tour un fois que c'est fait, avec arguments de retour.

C'est un peu bébête comme solution, mais ça marche bien.
Avatar
Gilles Vollant
"Bertrand Lenoir-Welter" a écrit dans le message
de news: 42a1d3eb$0$25048$
Ce que je fais dans ce cas, c'est un mini-exécutable qui est appelé par le
programme à déplacer/effacer/etc. et qui se charge de l'opération après
une pause. Le programme appelant lui passe en argument le délai avant
d'opérer, le type d'opération, le nom du programme à effacer ou déplacer
(nom de la cible dans ce cas), et le nom du programme à appeler à son tour
un fois que c'est fait, avec arguments de retour.



on peut même se contenter d'un batch. Ledit batch peut même se suicider
proprement sans laisser de trace




// -----------------------------------------------------------------------
// FUNCTION DeleteExecutableBF
// PURPOSE delete running executable using a batch file
// -----------------------------------------------------------------------
// INPUT void
//
// OUTPUT void
// -----------------------------------------------------------------------
// COMMENTS code addapted from Jeffrey Richter's column in
// Microsoft System Journal - January 1996
// -----------------------------------------------------------------------


#ifndef _T
#define _T(a) __TEXT(a)
#endif
#define DEL_UNINSTALL_BAT _T("KillUnin.bat")

void DeleteExecutableBF(void)
{
HANDLE hfile;
STARTUPINFO si;
PROCESS_INFORMATION pi;

// create a batch file that continuously attempts to delete our
executable file
// when the executable no longer exists, remove its containing
subdirectory,
// and then delete the batch file too.
hfile = CreateFile(DEL_UNINSTALL_BAT, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if(INVALID_HANDLE_VALUE != hfile)
{
TCHAR szBatFile[1000];
TCHAR szUnsetupPathname[MAX_PATH];
TCHAR szUnsetupPath[MAX_PATH];
DWORD dwNumberOfBytesWritten;
LPTSTR lpTrail=NULL;

// get the full pathname of our executable file.
GetModuleFileName(NULL, szUnsetupPathname, MAX_PATH);

// get the path of the executable file (without the filename)


GetFullPathName(szUnsetupPathname,MAX_PATH,szUnsetupPath,&lpTrail);
*lpTrail='';
if (lpTrail>szUnsetupPath)
if (*(lpTrail-1)=='')
*(lpTrail-1)='';


// construct the lines for the batch file
wsprintf(szBatFile,
_T(":REPEATrn")
_T("DEL "%s"rn")
_T("IF EXIST "%s" GOTO REPEATrn")
_T("RD "%s"rn")
_T("DEL "%s"rn"),
szUnsetupPathname, szUnsetupPathname, szUnsetupPath,
DEL_UNINSTALL_BAT);

// write the batch file and close it
WriteFile(hfile, szBatFile, lstrlen(szBatFile) * sizeof(TCHAR),
&dwNumberOfBytesWritten, NULL);
CloseHandle(hfile);

// get ready to spawn the batch file we just created.
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);

// we want its console window to be invisible to the user.
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

// spawn the batch file with low-priority and suspended.
if(CreateProcess(NULL, DEL_UNINSTALL_BAT, NULL, NULL, FALSE,
CREATE_SUSPENDED | IDLE_PRIORITY_CLASS, NULL, _T(""), &si, &pi))
{
// lower the batch file's priority even more.
SetThreadPriority(pi.hThread, THREAD_PRIORITY_IDLE);

// raise our priority so that we terminate as quickly as possible.
SetThreadPriority(GetCurrentThread(),
THREAD_PRIORITY_TIME_CRITICAL);
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);

// allow the batch file to run and clean-up our handles.
CloseHandle(pi.hProcess);
ResumeThread(pi.hThread);

// we want to terminate right away now so that we can be deleted
CloseHandle(pi.hThread);
}
}
}