2010-03-08 33 views
3

在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进程本身之外,我没有看到任何额外的创建。

我能解决这个问题的其他方法吗?我只是不希望函数返回,直到控制面板窗口关闭。

+0

尝试使用功能 “系统”,看看会发生什么。 – 2010-03-08 18:11:32

+0

@Jive Dadson:谢谢你的建议。不幸的是使用“系统”有同样的问题 - 在XP和Vista上调用系统块直到控制面板窗口关闭,但在Windows 7上它立即返回(使控制面板窗口保持打开状态)。 我想知道如何使用CreateProcess(),而不是返回一个实例句柄,我不能解决如何等待(WaitForSingleObject不起作用)。 – Vicky 2010-03-08 21:02:45

+0

对不起,在我最近的评论中,我的意思是“我想知道如何使用ShellExecute()”。 – Vicky 2010-03-08 21:05:27

回答

3

如果有人在同一个问题上磕磕绊绊:我终于在Microsoft Tech Support的帮助下解决了这个问题。

他们能够确认原始的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 
相关问题