2008-09-25 83 views
1

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

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

"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" Temporary Internet Files文件的绝对路径将被表示为

"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"提供。/"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函数给定一个虚拟路径将回传物理路径。

回答

0

一些后续关闭这个问题。

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

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

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

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

0

我使用了类似的系统,与X-申请浏览器中显示WAML Web应用程序和它完美的作品。也许你应该看看他们如何设法做到这一点。

0

它看起来像iexplore传递文件的shell名称空间“名称”而不是文件系统名称。

我不认为有一个文件化的方式来在命令行上传递一个shell项目标识符--Explorer将其自身,但有编组考虑因为shell项目标识符是(指向)二进制数据结构在单一过程中有效。

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