В Windows XP и Vista я могу запустить этот код:
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL bResult = FALSE;
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
bResult = CreateProcess(NULL,
"rundll32.exe shell32.dll,Control_RunDLL modem.cpl",
NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL,
&si, &pi);
if (bResult)
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
и работает так, как я и ожидал, то есть WaitForSingleObject не возвращается, пока окно панели управления модемом не будет закрыто пользователем.
В Windows 7 тот же код WaitForSingleObject возвращает сразу (с кодом возврата 0, указывающим, что объект сигнализировал запрошенное состояние).
Точно так же, если я возьму его в командную строку, на XP и Vista я могу запустить
start /wait rundll32.exe shell32.dll,Control_RunDLL modem.cpl
, и он не возвращает управление в командную строку, пока окно панели управления не будет закрыто, но в Windows 7 оно немедленно возвращается.
Это изменение в RunDll32? Я знаю, что MS внесла некоторые изменения в RunDll32 в Windows 7 для UAC, и из этих экспериментов видно, что одно из этих изменений могло включать создание дополнительного процесса для отображения окна и разрешение исходящему процессу завершиться. Единственное, что заставляет меня думать, что это может быть не так, это то, что при использовании проводника процессов, который показывает создание и уничтожение процессов, я не вижу ничего дополнительного, созданного помимо самого вызываемого процесса rundll32.
Любой другой способ, которым я могу решить это? Я просто не хочу, чтобы функция возвращалась до тех пор, пока не закроется окно панели управления.