登録済みのMIMEヘルパーアプリケーションを起動する
-
02-07-2019 - |
質問
以前は、Windowsレジストリに特定のMIMEタイプを登録することで、ローカルにインストールされたヘルパーアプリケーションを起動できました。これにより、ユーザーが社内ブラウザアプリケーションの現在のインストールへのリンクを1回クリックできるようになりました。これは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
オブジェクトを作成しようとしたときに、物理ファイルに解決されません。
物理パスに、" Content.IE5 \ ALBKHO3Q"
のインターネット一時ファイルのInternet Explorer隠しキャッシングサブディレクトリがありません。絶対パスは次のようになります
"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ヘルパーは、ユーザーがデスクトップブラウザーアプリケーションのインストールへのリンクを含む内部Webページをクリックしたときにのみ呼び出されます。そのインストールは、" application / x-expeditors"
のMIMEタイプで返されます。 " .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
を試しましたが、IEから渡された仮想パスではなくURLが必要です。
私の希望は、仮想パスを指定して物理パスを返すシェル関数があることです。
解決 5
この質問を締めくくるためのフォローアップ。
実際の問題は、TFileStreamを使用してファイルハンドルを作成する方法でした。ファイルロックの問題であることが判明した fmOpenReadまたはfmShareDenyWrite で開くように変更しました。
srcFile := TFileStream.Create(physicalFilename, fmOpenRead or fmShareDenyWrite);
他のヒント
IEによって作成されたサブディレクトリはランダムに生成されるため、毎回同じ名前が付けられることを保証することはできません。レジストリメソッドで問題となるのは、ファイルはまだキャッシュ内にあります...キャッシュを空にすると、ファイルが削除され、さらに別のインストールが必要になります。
このヘルパーをアプリケーションデータにインストールする方が良いでしょうか?
これについてはわかりませんが、おそらく正しい方向に導くかもしれません。wininetDLLのURLキャッシュ関数を使用してみてください: FindFirstUrlCacheEntry 、 FindNextUrlCacheEntry 、 FindCloseUrlCache を列挙し、ローカルファイル名が指定されたパスに一致するエントリを見つけると、 RetrieveUrlCacheEntryFile でファイルを取得します。
WAML Webアプリケーションを表示するためにX-Applブラウザーで同様のシステムを使用していますが、完全に機能します。たぶんあなたは彼らがどうやってそれを成し遂げたかを見る必要があるでしょう。
iexploreはシェル名前空間" name"を渡しているようですファイルシステム名ではなくファイルの名前。
コマンドラインでシェルアイテムIDを渡す文書化された方法があるとは思わない-エクスプローラはそれを自分自身に行いますが、シェルアイテムIDは(ポインタ)有効なバイナリデータ構造であるため、マーシャリングの考慮事項があります単一のプロセスで。
私がやろうとしているのは: 1. SHGetDesktopFolderを呼び出して、シェル名前空間のルートIShellFolderオブジェクトを返します。 2. IShellFolder :: ParseDisplayNameを呼び出して、指定された名前をシェルアイテムIDリストに戻します。 3. IShellFolder :: GetDisplayNameOFにSHGDN_FORPARSINGフラグを付けて試してください-率直に言って、w'eveが完全な円を描いて、始めたところに戻ったように感じます。なぜなら、このAPIは、「間違った」を返すことに最終的に責任があると思うからです。ファイルシステムの相対パス。