【问题标题】:Start external exe within own process在自己的进程中启动外部 exe
【发布时间】:2011-02-25 08:15:47
【问题描述】:

我有一个 VB6 可执行文件,我们将其用作我们实际程序的 Starter 可执行文件。

问题是windows 7在任务栏中为新进程显示了一个新图标,而不是我点击启动程序的那个图标(当然,因为starter exe已经结束,新的exe似乎成为一个新程序)。

目前我使用 Shell 对象来启动另一个 exe。有没有更好的方法从 vb6 中做到这一点,也许是通过使用带有声明的本机 C 函数在当前进程中启动一个 exe,而不产生新进程?

编辑:

感谢 atzz 提供有关应用程序模型 ID 的重要信息。现在,我的应用程序启动器的快捷方式具有明确定义的 ID,并且我的应用程序还在启动时设置了 ID,现在可以从工具栏中的右侧图标精美地访问。但是,仍然存在两个问题:

  1. 该应用程序是使用 Exe4J 启动的 Java 应用程序,在 Exe4J 显示启动画面之前我没有任何机会设置 AppID,因此在显示启动画面时任务栏中有第二个图标。

  2. 如果我不手动将启动应用程序图标从桌面拖动到工具栏,而是使用我的应用程序图标并将其设置为“粘性”,则实际应用程序会被粘贴,而不是启动器。

如果我的启动器从自己的进程中启动应用程序,这两个问题都会得到很好的解决。我听说在 linux 程序中使用 exec() 而不是 fork() 来实现这一点...... windows 有类似的东西吗?

【问题讨论】:

  • 我不知道有什么方法可以在当前进程中启动不同的可执行文件。为什么需要使用用 VB 6 编写的单独的加载程序应用程序?这解决了什么问题?
  • 检查是否有可用更新的问题。如果我从主可执行文件中检查,我不能自己覆盖它。此外,这可确保始终可以更新有缺陷的主可执行文件。
  • 您可能不想在 Windows 机器上让正在运行的进程切换其中的实际可执行代码。有办法,但任何病毒/恶意软件扫描程序都会发疯(基本上你的问题完美地描述了恶意代码是如何试图传播的)。坚持使用启动器 - 对于您描述的情况/目标,这是一个完全可以接受的解决方案。
  • 我不想注入代码,我只想设置另一个进程的Application User Model ID!应该有一个 API...

标签: winapi windows-7 vb6 executable taskbar


【解决方案1】:

我相信有一种方法可以通过 Windows 7 任务栏 API 完成您所需要的工作,尽管我自己从未做过,因此记不太清楚我读过的关于该主题的内容。查看应用程序 ID 概念。

一些链接:

【讨论】:

  • +1 很好的答案,我相信在摆弄应用程序 ID 时,我将能够得到我想要的。完成后会发布我的解决方案。
  • @Daniel - 哇,这太出乎意料了!不是我在抱怨,请注意:)
  • 比丢分要好 *g...如果您不希望他们开始赏金并将它们还给我;)...开玩笑。
【解决方案2】:

如果问题是图标,为什么不给两个程序相同的图标(和相同的 App.Title)。然后用户将无法分辨两个任务栏条目之间的区别。大概它们不是同时可见的。

或者将您的启动应用程序设置为不显示在任务栏中(设计视图中的表单属性 ShowInTaskbar = False)

【讨论】:

  • 是的,我同意。第二种解决方案似乎是迄今为止最简单的。唯一的缺点是启动应用程序后,某些内容不会立即显示在用户的任务栏上。我想您必须根据帮助应用程序的工作量以及加载真实应用程序需要多长时间来做出决定。
  • 问题是,通常,当任务栏上有一个粘性快捷方式时,正在运行的应用程序显示为快捷方式周围的按钮(?)边框。如果应用有自己的 exe 和进程,任务栏中会弹出另一个图标。
  • 好的,所以问题是特定于特殊的 Windows 7 任务栏。在这种情况下,请使用 atzz's answer
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 2012-10-28
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多