我曾经能够通过在Windows注册表中注册给定的mime类型来启动本地安装的帮助应用程序。这使我能够允许用户在指向我们内部浏览器应用程序的当前安装的链接上单击一次。这在Internet Explorer 5(大多数情况下)和Firefox中运行良好,但现在在Internet Explorer 7中不起作用。

传递给我的shell / open /命令的文件名不是下载的安装包的完整物理路径。我通过IE传递的路径参数是

"C:\Document and Settings\chq-tomc\Local Settings\Temporary Internet Files\
  EIPortal_DEV_2_0_5_4[1].expd"

在调用 FileExists()或尝试创建 TFileStream 对象时,遗憾的是这并未解析为物理文件。

物理路径缺少Internet Explorer隐藏缓存子目录,用于" Content.IE5 \ ALBKHO3Q" 的临时Internet文件,其绝对路径将表示为

"C:\Document and Settings\chq-tomc\Local Settings\Temporary Internet Files\ 
  Content.IE5\ALBKHO3Q\EIPortal_DEV_2_0_5_4[1].expd"

是的,子目录是由IE随机生成的,只要IE传递给我的帮助应用程序的完整路径就不应该是一个问题,不幸的是它没有。

安装mime帮助应用程序不是问题。它通过全球登录脚本安装/更新,适用于全球10,000多名用户。只有当用户单击带有指向我们桌面浏览器应用程序安装的链接的内部网页时,才会调用mime助手。该安装使用mime类型的" application / x-expeditors" 进行回送。注册" .expd" / " application / x-expeditors" mime-type看起来像这样。

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.expd] 
@="ExpeditorsInstaller"
"Content Type"="application/x-expeditors"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller]
"EditFlags"=hex:00,00,01,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell\open]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell\open\command]
@="\"C:\\projects\\desktop2\\WebInstaller\\WebInstaller.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type\application/x-expeditors]
"Extension"=".expd"

我曾考虑枚举所有用户的IE缓存条目,但我会担心检查它们可能需要多长时间,或者我可能最终在我正在寻找的当前条目之前找到一个较旧的缓存条目。但是,括号内的文件名后缀" [n]" 可能是唯一的密钥。

我尝试了wininet方法 GetUrlCacheEntryInfo ,但这需要URL,而不是IE传递的虚拟路径。

我希望有一个Shell函数,给定一个虚拟路径将回送物理路径。

有帮助吗?

解决方案 5

关闭这个问题的一些后续行动。

原来真正的问题是我是如何使用TFileStream创建文件句柄的。我改为使用 fmOpenRead或fmShareDenyWrite 打开,这解决了原因是文件锁定问题。

srcFile := TFileStream.Create(physicalFilename, fmOpenRead or fmShareDenyWrite);

其他提示

我相信IE创建的子目录是随机生成的,所以你不能保证它每次都会被命名为相同,而我用注册表方法看到的问题是它只能在文件仍在缓存中...清空缓存会清除需要另外安装的文件。

将此帮助程序安装到应用程序数据中会不会更好?

我不确定这一点但也许这可能会引导您朝着正确的方向前进:尝试使用wininet DLL中的URL缓存功能: FindFirstUrlCacheEntry FindNextUrlCacheEntry FindCloseUrlCache 用于枚举,当您找到其本地文件名与给定路径匹配的条目时,您可以使用 RetrieveUrlCacheEntryFile 以检索文件。

我正在使用与X-Appl浏览器类似的系统来显示WAML Web应用程序,它运行良好。也许你应该看看他们是如何做到的。

看起来iexplore正在传递shell命名空间“name”和该文件而不是文件系统名称。

我不认为在命令行上有一个记录的方法可以传递一个shell项目标识符 - 资源管理器对它自己做了,但是有一些编组注意事项,因为shell项目id(指向)只能有效的二进制数据结构在一个过程中。

我可能会尝试做的是: 1.调用SHGetDesktopFolder,它将返回shell命名空间的根IShellFolder对象。 2.调用IShellFolder :: ParseDisplayName将您给出的名称转换回shell项目ID列表。 3.尝试使用SHGDN_FORPARSING标志的IShellFolder :: GetDisplayNameOF - 坦率地说,感觉就像刚刚完成一个完整的循环并回到我们开始的地方。因为我认为它的这个API最终负责返回“错误”的文件系统相对路径。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top