在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在用户关闭modem控制面板窗口之前不会返回。
在Windows7上,相同的代码waitForSingleObject直接返回(返回代码为0,表示该对象表示请求的状态)。
类似地,如果我把它放到命令行,在xp和vista上我可以运行
start /wait rundll32.exe shell32.dll,Control_RunDLL modem.cpl
在控制面板窗口关闭之前,它不会将控件返回到命令提示符,但在Windows7上它会立即返回。
这是rundll32中的更改吗?我知道ms在windows7foruac中对rundll32做了一些更改,从这些实验来看,其中一个更改可能涉及生成一个额外的进程来显示窗口,并允许原始进程退出。唯一让我认为可能不是这样的情况是,使用显示进程的创建和销毁的process explorer,除了被调用的rundll32进程本身之外,我看不到任何额外的创建。
我还有别的办法解决这个问题吗?我只是不希望在控制面板窗口关闭之前函数返回。