【问题标题】:Why does RunDLL32 process exit early on Windows 7?为什么 RunDLL32 进程在 Windows 7 上提前退出?
【发布时间】: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


【解决方案1】:

以防其他人偶然发现同样的问题:我终于在 Microsoft 技术支持的帮助下解决了这个问题。

他们能够确认原来的 RunDll32 进程仍在运行(它没有产生新进程),但无论出于何种原因,他们不知道答案,WaitForSingleObject() 正在该进程上立即返回。

解决方法是使用 CPLApplet 以不同方式触发控制面板窗口,如本例所示:http://support.microsoft.com/kb/232536

但是,由于 32 位调制解调器控制面板在 64 位 Windows 中不起作用(它显示但“添加”按钮无效),问题变得更加复杂。我已经在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    相关资源
    最近更新 更多