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 <<
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.").
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.").
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.").
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.
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.
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.
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.
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.
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.
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 // -----------------------------------------------------------------------
// 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); } } }
"Bertrand Lenoir-Welter" <bertrand.2004@galaad.net> a écrit dans le message
de news: 42a1d3eb$0$25048$8fcfb975@news.wanadoo.fr...
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
// -----------------------------------------------------------------------
// 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);
}
}
}
"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 // -----------------------------------------------------------------------
// 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); } } }