我正在研究一个包含通用引擎,一些程序特定内容和自定义自动更新程序的程序,以便尽可能高效地处理在内容中更新数千兆字节的媒体。 在引擎的最新版本中,我们重新组织了我们的目录结构,而不是将可执行文件安装到(例如) 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是:
.bat
文件.exe
并让它运行,所以这需要一个实际生成一个.exe
。 这些选项中的任何一个都可以工作,如果是这样的话? 在Windows上做这种事情的最好方法是什么? 我是否错过了将快捷方式从一个位置redirect到另一个位置的其他方法?
编辑添加 :我们有一些额外的要求:
奇怪的是,没有人提到NTFS硬链接 。
一些参考:
为什么不能在安装更新时覆盖快捷方式?
您应该只覆盖默认快捷方式,而不是用户可能创建的每个快捷方式。 不过,对于第二种情况,你可以使用选项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。