在Windows XP和Vista中,我可以運行此代碼:爲什麼RunDLL32進程在Windows 7上儘早退出?
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在Windows 7中對UAC中的RunDll32做了一些更改,從這些實驗中可以看出,其中一項更改可能會產生額外的進程來顯示窗口,並允許初始化進程退出。唯一讓我想到這可能不是這樣的情況是,使用顯示進程創建和銷燬的進程資源管理器,除了被稱爲rundll32進程本身之外,我沒有看到任何額外的創建。
我能解決這個問題的其他方法嗎?我只是不希望函數返回,直到控制面板窗口關閉。
嘗試使用功能 「系統」,看看會發生什麼。 – 2010-03-08 18:11:32
@Jive Dadson:謝謝你的建議。不幸的是使用「系統」有同樣的問題 - 在XP和Vista上調用系統塊直到控制面板窗口關閉,但在Windows 7上它立即返回(使控制面板窗口保持打開狀態)。 我想知道如何使用CreateProcess(),而不是返回一個實例句柄,我不能解決如何等待(WaitForSingleObject不起作用)。 – Vicky 2010-03-08 21:02:45
對不起,在我最近的評論中,我的意思是「我想知道如何使用ShellExecute()」。 – Vicky 2010-03-08 21:05:27