在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