1

我正在开发一个程序,其中包括一个通用引擎、一些程序特定内容和一个自定义自动更新程序,以尽可能有效地处理更新我们内容中的数 GB 价值的媒体。在最近发布的引擎中,我们重新组织了我们的目录结构,而不是将可执行文件安装到 (例如) c:\Program Files\Program\Engine.exe,它现在位于c:\Program Files\Program\engine\win32\NewEngine.exe(请注意,在此过程中引擎的名称也发生了变化)。

问题是,为了启动程序,用户需要使用快捷方式,我们将其安装在他们的开始菜单和(可选)他们的桌面上。不过,更新后引擎的移动会破坏这些快捷方式。所以现在我需要找到一种方法来修复用户为了启动程序而拥有的所有快捷方式。

来自 Unix/Mac OS X 背景,我倾向于只创建一个从旧可执行文件名称到新可执行文件名称的符号链接。据我所知,在 Windows 上并没有真正的符号链接(从谷歌搜索,我看到Vista 和更高版本上有符号链接,但这需要在 XP 上工作)。我的假设错了吗?Windows 上是否有与可执行文件的符号链接等效的东西?

想到的其他一些可能的解决方案是:

  1. 在旧位置创建一个小型可执行文件,在新位置启动真正的可执行文件。是否有任何快速简便的方法来创建一个简单的、无头的可执行文件,它只是启动另一个程序?同样,在 Unix 上,我只是创建一个 shell 脚本,但据我所知,我无法命名一个.bat文件.exe并让它运行,所以这需要一种实际生成.exe.
  2. 更新后,搜索指向可执行文件的所有快捷方式并进行编辑。是否有任何(有效且可靠)的方法来查找系统上指向给定位置的所有快捷方式并更新它们?
  3. 上述的组合,带有一个小的可执行文件,它检测到它是从快捷方式启动的,并在启动真正的程序之前编辑该快捷方式。有什么方法可以检测到程序正在从快捷方式启动,从而能够编辑该快捷方式?

这些选项中的任何一个是否有效,如果有效,如何?在 Windows 上执行此类操作的最佳方法是什么?我是否错过了将快捷方式从一个位置重定向到另一个位置的任何其他方法?

编辑添加:我们有一些额外的要求:

  1. 我们的许多用户都是非技术人员。任何需要用户干预的解决方案都是不可能的。
  2. 这应该尽可能无缝。每次用户单击快捷方式时都会弹出任何额外的窗口是不可接受的。
  3. 面对用户可以做的大多数事情,这应该是稳健的,例如重新排列他们的开始菜单或将快捷方式移动到快速启动栏。
  4. 我们的快捷方式对于程序的运行是绝对必要的,因为它们传递了引擎加载内容所必需的参数(是的,这不太理想;我更愿意解决这个问题,但目前不能)
  5. 我正在寻找相对快速且易于实施且极其可靠的东西。
4

6 回答 6

3

奇怪的是,没有人提到NTFS Hard Links

一些参考资料:

于 2010-01-13T03:47:31.527 回答
1

为什么在安装更新的过程中不能覆盖快捷方式?

您应该只覆盖默认快捷方式,而不是用户可能创建的每个快捷方式。不过,对于第二种情况,您可以使用选项 1,但是是的,它必须是真正的可执行文件。

(我认为您可以放心地假设,如果用户在非标准位置创建了第三个快捷方式,当复制的快捷方式不起作用时,他知道这意味着什么或在哪里查找信息。哎呀,您甚至可以发出警告更新程序中的某处注意到更改。)

如果您真的想做您所说的(更新每个快捷方式),您可以使用此处接受的答案的方法的扩展来做到这一点。只需搜索任何 .lnk 文件,查看 TargetPath 是否是旧引擎位置,如果是则更新它。

于 2009-10-10T04:55:30.380 回答
1

好吧,我们决定的解决方案只是做一个小的可执行文件来启动我们的真实引擎。使用 Visual Studio 来设置项目比我希望的要花更多的时间,但它似乎正在奏效。

#include "stdafx.h"
#include <shellapi.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
  HINSTANCE result = ShellExecute(NULL, _T("open"), 
                                  _T("engine\\win32\\NewEngine.exe"),
                                  lpCmdLine, NULL, 1);
  // ... handle errors ...
  return 0;
}

编辑:不。这似乎适用于 XP,但不适用于 Windows 7 或 Vista。任何关于为什么这会在 Windows 7 或 Vista 上失败的想法将不胜感激。如果我不能很快解决这个问题,我可能会将其分解为一个单独的问题。

编辑2:啊。在 XP 上,路径名中的正斜杠可以正常工作。在 Vista 或更新版本上,您需要反斜杠。

于 2009-10-13T15:31:34.330 回答
1

ShellExecute() 的 MSDN 文档中,我注意到您可能需要初始化 COM。此外,您需要提供可执行文件的完整路径(不是相对路径)。或者,您可以在快捷方式中使用 ENVIRONMENT 变量而不是完整路径。您可以在新安装期间修改 ENVIRONMENT 变量以反映新路径。

于 2009-10-19T09:10:35.170 回答
0

这对我来说听起来像是一个安装程序问题。在升级过程中,为什么不直接卸载旧版本并安装新版本?我不熟悉 Inno Setup,但这就是我们如何执行 InstallShield 安装程序以进行升级。当然,这不能处理用户手动创建快捷方式的情况;但是,用户可以重新创建它。至于简单的搜索和替换,我认为不值得。

于 2009-10-11T14:02:30.320 回答
0

而不是 ShellExecute,尝试 CreateProcess 或 spawn 等价物。我会打赌 CreateProcess。

于 2009-10-14T10:20:02.303 回答