Changeset 382d36b80598…
Parent 89203f4e871a…
by
Changes to one file · Browse files at 382d36b80598 Showing diff from parent 89203f4e871a Diff from another changeset...
@@ -17,15 +17,52 @@
#include "THgStatus.h"
-// terminates the overlay icon server
+#include <tlhelp32.h>
+#define TIMEOUT_VALUE 5000
+#define EXECUTABLE_NAME "TortoiseHgOverlayServer.exe"
+
+// This library implements a custom action for Windows Installer that terminates
+// the overlay icon server.
extern "C" UINT __stdcall TerminateIconServer()
{
- if (CTHgStatus::Terminate() == 0)
+ // Enumerate processes to attempt to find the overlay icon server.
+ HANDLE hProcess = NULL;
+ HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0L);
+ if (hSnapshot != NULL)
{
- // pipe ok, so icon server is running
- // -> wait a bit for icon server to shut down
- ::Sleep(5000 /* ms */);
+ PROCESSENTRY32 pe;
+ pe.dwSize = sizeof(PROCESSENTRY32);
+ if (::Process32First(hSnapshot, &pe))
+ {
+ do
+ {
+ CString strExeName(pe.szExeFile);
+ if (strExeName.CompareNoCase(EXECUTABLE_NAME) == 0)
+ {
+ hProcess = ::OpenProcess(SYNCHRONIZE, FALSE, pe.th32ProcessID);
+ break;
+ }
+ } while(::Process32Next(hSnapshot, &pe));
+ }
+ ::CloseHandle(hSnapshot);
}
+
+ // Attempt to terminate the server.
+ if(CTHgStatus::Terminate() == 0)
+ {
+ if (hProcess != NULL)
+ {
+ ::WaitForSingleObject(hProcess, TIMEOUT_VALUE);
+ ::CloseHandle(hProcess);
+ }
+ else
+ {
+ // If a process handle is not available but the server was running,
+ // stall for a brief time to allow the server to terminate.
+ ::Sleep(TIMEOUT_VALUE);
+ }
+ }
+
return ERROR_SUCCESS;
}
|
Loading...