1

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

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

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

FileExists()不幸的是,在调用或尝试创建TFileStream对象时,这不会解析为物理文件。

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

"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"/ mime 类型的注册"application/x-expeditors"看起来像这样。

[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 函数将交回物理路径。

4

5 回答 5

0

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

将此助手安装到应用程序数据中不是更好吗?

于 2008-09-26T02:28:02.240 回答
0

我对此不确定,但也许这可能会引导您朝着正确的方向前进:尝试使用 wininet DLL 中的 URL 缓存函数:FindFirstUrlCacheEntryFindNextUrlCacheEntryFindCloseUrlCache进行枚举,并且当您找到本地文件名与给定路径匹配的条目时您可以使用RetrieveUrlCacheEntryFile来检索文件。

于 2008-09-26T12:15:12.210 回答
0

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

于 2008-11-15T09:59:06.430 回答
0

看起来 iexplore 正在传递文件的外壳命名空间“名称”而不是文件系统名称。

我不认为有一个记录在案的方式可以在命令行上传递一个 shell 项 id - explorer 自己做,但是有编组考虑因素,因为 shell 项 id 是(指向)二进制数据结构,仅在单个中有效过程。

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

于 2009-02-06T12:42:38.803 回答
0

一些后续行动来结束这个问题。

Turned out the real issue was how I was creating the file handle using TFileStream. I changed to open with fmOpenRead or fmShareDenyWrite which solved what turned out to be a file locking issue.

srcFile := TFileStream.Create(physicalFilename, fmOpenRead or fmShareDenyWrite);
于 2009-03-23T22:22:56.060 回答