【发布时间】:2011-01-25 01:58:38
【问题描述】:
在 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 对 UAC 的 Windows 7 中的 RunDll32 进行了一些更改,从这些实验中看起来,其中一项更改可能涉及生成一个额外的进程来显示窗口,并允许原始进程退出。唯一让我认为情况可能并非如此的是,使用显示进程创建和销毁的进程资源管理器,我看不到除了调用的 rundll32 进程本身之外还有任何其他创建。
还有什么办法可以解决这个问题吗?我只是不希望函数在控制面板窗口关闭之前返回。
【问题讨论】:
-
试试“系统”功能,看看会发生什么。
-
@Jive Dadson:感谢您的建议。不幸的是,使用“系统”也有同样的问题——在 XP 和 Vista 上,对系统的调用会阻塞,直到控制面板窗口关闭,但在 Windows 7 上它会立即返回(使控制面板窗口保持打开状态)。我想知道是否使用 CreateProcess() 代替,但它返回一个实例句柄,我不知道如何等待(WaitForSingleObject 不起作用)。
-
抱歉,在我的上一条评论中,我的意思是“我想知道使用 ShellExecute() 代替”。
-
使用 ShellExecuteEx() 并等待返回的进程(这是一个有效的进程句柄)给出完全相同的效果。
标签: windows-7 process rundll32