2008-09-25 81 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最終負責返回「錯誤」的文件系統相對路徑。