从Delphi app打开Chrome时出错

时间:2016-04-20 10:30:37

标签: google-chrome delphi

我有一个网络应用程序。我从使用Delphi创建的Windows应用程序启动它。 在我的代码中,我使用

启动chrome
ShellExecEx(ChromePath, AppStartCmd, '', SW_SHOWMAXIMIZED)

https://github.com/project-jedi/jcl/blob/master/jcl/source/windows/JclShell.pas

如果第一个Chrome进程是我在我的电脑上启动的第一个进程,如果我想打开另一个Chrome窗口(例如用户启动电脑,启动应用程序,然后他想在谷歌上搜索一些东西......)我有这条消息

enter image description here

否则,如果我首先打开Chrome页面,然后我想启动webapp就可以了。

对于我的测试,当我启动具有相同参数的应用程序

时,我创建了一个Chrome桌面快捷方式
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --app=http://myapppath

在这种模式下,chrome工作正常。

使用ProcessExplorer我已经看到通过桌面截图启动webapp我有一个可识别的过程 enter image description here

通过ShellExecEx启动应用程序该过程是匿名的...... enter image description here

1 个答案:

答案 0 :(得分:1)

您的程序启动的Chrome实例显然具有提升的权限。当用户稍后手动运行Chrome时,它无法与提升的副本通信,因为不允许窗口消息流向更高权限的窗口。 Chrome将其解释为没有响应。

进程从其父级继承其权限级别,这意味着您的程序正在运行提升,这可能意味着您也正在运行Delphi。你不应该这样做,所以我建议你停下来。

或者,您可以尝试以低于您的程序的权限执行Chrome进程。 Raymond Chen blogged about that a few years ago并解释说这不是微不足道的。他演示了获取桌面shell自动化对象,然后获取IShellDispatch2接口,最后调用该接口的ShellExecute方法,有效地使Explorer执行程序而不是程序自己执行它。这是因为Explorer作为当前用户运行,而不是作为提升用户运行,因此它执行的任何操作都不会被提升。