如何将所有快捷方式redirect到给定的可执行文件? Windows上有什么等效的符号链接?

我正在研究一个包含通用引擎,一些程序特定内容和自定义自动更新程序的程序,以便尽可能高效地处理在内容中更新数千兆字节的媒体。 在引擎的最新版本中,我们重新组织了我们的目录结构,而不是将可执行文件安装到(例如) c:\Program Files\Program\Engine.exe ,它现在位于c:\Program Files\Program\engine\win32\NewEngine.exe (注意在这个过程中引擎的名字也改变了)。

问题是,为了启动程序,用户需要使用一个快捷方式,我们安装在他们的开始菜单和(可选)在他们的桌面上。 尽pipe如此,更新之后引擎的移动却打破了这些捷径。 所以现在我需要找出一种方法来修复用户启动程序的所有快捷方式。

从Unix / Mac OS X的背景来看,我倾向于从旧的可执行文件名称到新的可执行文件名称创build一个符号链接。 据我所知,在Windows上并没有真正的符号链接(从谷歌search,我看到在Vista和后来的符号链接 ,但这需要在XP上工作)。 我的假设是错的吗? Windows上是否有与可执行文件相符的符号链接?

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

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

这些选项中的任何一个都可以工作,如果是这样的话? 在Windows上做这种事情的最好方法是什么? 我是否错过了将快捷方式从一个位置redirect到另一个位置的其他方法?

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

  1. 我们的许多用户是非技术性的。 任何需要用户干预的解决scheme都是不可能的。
  2. 这应该尽可能无缝。 每次用户单击快捷方式时都会popup任何额外的窗口,这是不可接受的。
  3. 在面对用户可能完成的大部分事情时,这应该是可靠的,比如重新安排开始菜单或将快捷方式移动到快速启动栏。
  4. 我们的快捷方式对于程序的运行是绝对必要的,因为它们传递引擎加载内容所必需的参数(是的,这不是理想的;我宁愿修复这一点,但不能在这一点上)
  5. 我正在寻找一些相对快速,易于实施和非常可靠的方法。

奇怪的是,没有人提到NTFS硬链接

一些参考:

  • MSDN中Win32 API文档的CreateHardLink函数 ;
  • NTFS硬链接,目录连接和Windows快捷方式 ;
  • Windows符号和硬链接 ;
  • 链接外壳扩展 – 硬链接 。

为什么不能在安装更新时覆盖快捷方式?

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

(我想你可以放心地假设,如果用户在非标准位置创建了第三个快捷方式,他知道当复制的快捷方式不起作用时它的含义或在哪里查找信息,甚至可以发出警告更新器中的某处注意到这些更改。)

如果你真的想做你所说的话(更新每一个快捷方式),你可以在这里接受答案的方法扩展。 只要搜索任何.lnk文件,看看TargetPath是否是旧的引擎位置,如果是,则更新它。

那么,我们决定的解决方案只是做一个小的可执行文件,启动我们的真正的引擎。 为了让这个项目比我更喜欢的方式建立起来,它需要更多的时间来与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或更新版本上,你需要反斜杠。

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

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

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