Как указывает другой ответ, дескриптор процесса получает сигнал, когда процесс прекращает выполнение, и операционной системе может потребоваться немного больше времени для освобождения DLL.
Вы правы, полагая, что сон (100) - плохая идея. Вы должны вместо этого перезаписать свои библиотеки DLL в цикле следующим образом:
BOOL UpdateDll(LPCTSTR dll_name, WHATEVER whatever) {
int tries = 150;
while (tries--) {
if (TryUpdateDll(dll_name, whatever))
return TRUE;
Sleep(200);
}
return FALSE;
}
Это продолжает пытаться выгрузить вашу DLL в течение 30 секунд, а затем сдается. 30 секунд должно быть достаточно, даже если система находится под большой нагрузкой, но все равно защитит ваш апдейтер от зависания навсегда. (В случае, если UpdateDll возвращает FALSE, убедитесь, что предоставили осмысленное сообщение об ошибке своему пользователю с указанием имени вызывающей DLL).
Если вы возитесь с COM, вызов CoFreeUnusedLibraries перед выходом также может быть полезен. (http://msdn.microsoft.com/en-us/library/ms679712.aspx) Честно говоря, я не знаю, может ли COM удерживать библиотеки DLL даже после завершения вашего процесса, но лучше быть в безопасности.
Суть в том, что в Win32 API много странностей. Вам не нужно заниматься каждым делом, пока вы можете найти приемлемое решение. Очевидно, что Sleep (100) может нарушиться, но 30-секундные циклы опроса кажутся мне приемлемыми.