【问题标题】:Error opening Chrome from Delphi app从 Delphi 应用程序打开 Chrome 时出错
【发布时间】:2016-04-20 10:30:36
【问题描述】:

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

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

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

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

否则,如果我先打开一个 Chrome 页面,然后我想启动 webapp,它就可以正常工作。

对于我的测试,当我使用相同的参数启动应用程序时,我制作了一个 chrome 的桌面快捷方式

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --app=http://myapppath

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

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

通过 ShellExecEx 启动应用程序的过程是匿名的...

【问题讨论】:

  • 你应该使用 CreateProcess 而不是 ShellExecute
  • 您需要完全运行 Chrome 吗?或者它可以是默认的系统浏览器?因为对于默认浏览器,您可以运行 ShellExecEx('http://site.url') 并且不要弄乱参数。 URL 将由系统处理并执行 HTTP 链接的默认应用程序。
  • 它不是匿名进程。它具有更高权限(管理员)的进程使用 RunAs ShellExecEx(ChromePath, AppStartCmd, 'runas', SW_SHOWMAXIMIZED); 代替。或搜索ShellExecuteElevated

标签: google-chrome delphi


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多