Windows 7 为什么RundL32进程在Windows 7上提前退出?

Windows 7 为什么RundL32进程在Windows 7上提前退出?,windows-7,process,rundll32,Windows 7,Process,Rundll32,在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;

在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不会返回

在Windows7上,相同的代码WaitForSingleObject立即返回(返回代码为0表示该对象发出请求状态的信号)

类似地,如果我把它带到命令行,我可以在XP和Vista上运行它

start /wait rundll32.exe shell32.dll,Control_RunDLL modem.cpl
在控制面板窗口关闭之前,它不会将控制返回到命令提示符,但在Windows7上,它会立即返回

这是RundL32的一个变化吗?我知道MS在Windows7forUAC中对RunDll32做了一些更改,从这些实验中可以看出,其中一个更改可能涉及生成一个额外的进程来显示窗口,并允许原始进程退出。唯一让我觉得情况可能不是这样的是,使用显示进程创建和销毁的process explorer,除了被称为rundll32进程本身之外,我看不到任何其他创建


我还有别的办法解决这个问题吗?在控制面板窗口关闭之前,我不希望函数返回。

以防其他人遇到同样的问题:在Microsoft技术支持的帮助下,我终于解决了这个问题

他们能够确认原始RunDll32进程仍在运行(它尚未生成新进程),但由于不知道答案的任何原因,WaitForSingleObject()将立即在该进程上返回

解决方法是使用CPLApplet以不同方式启动控制面板窗口,如本例所示:

然而,由于32位调制解调器控制面板在64位窗口中不工作(它会显示,但“添加”按钮无效),问题变得更加复杂。我已经在64位平台上的RunDLL解决方案中关闭了WOW64重定向,这很好,但在32位应用程序中无法加载64位库,因此我必须生成一个新进程来完成此操作

总之:

Win 7 64 bit: call CPLApplet via CreateProcess in 64-bit executable
Win 7 32 bit: call CPLApplet within my installer
XP / Vista 64 bit: turn off WOW64 redirection, use RunDll32
XP / Vista 32 bit: use RunDll32

试试“系统”功能,看看会发生什么。@Jive Dadson:谢谢你的建议。不幸的是,使用“系统”也有同样的问题——在XP和Vista上,对系统的调用会一直阻塞,直到控制面板窗口关闭,但在Windows 7上它会立即返回(保持控制面板窗口打开)。我想改为使用CreateProcess(),但这会返回一个实例句柄,我不知道如何等待(WaitForSingleObject不工作)。对不起,在我的上一条评论中,我的意思是“我想改为使用ShellExecute()”。使用ShellExecuteEx()并等待返回的进程(这是一个有效的进程句柄)产生完全相同的效果。