1

以前は、Windowsレジストリに特定のmimeタイプを登録することで、ローカルにインストールされたヘルパーアプリケーションを起動できました。これにより、ユーザーが内部ブラウ​​ザアプリケーションの現在のインストールへのリンクを1回クリックできるようになりました。これは、Internet Explorer 5(ほとんどの場合)およびFirefoxで正常に機能しましたが、InternetExplorer7では機能しなくなりました。

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"物理パスに、絶対パスが次のように表されるインターネット一時ファイルのInternetExplorer隠しキャッシュサブディレクトリがありません。

"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ページをクリックしたときにのみ呼び出されます。そのインストールは、mime-typeので返され"application/x-expeditors"ます。".expd"/ mime-typeの登録は"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たが、IEから渡された仮想パスではなく、URLが必要です。

私の望みは、仮想パスを指定すると物理パスを返すシェル関数があることです。

4

5 に答える 5

0

この質問を締めくくるためのフォローアップ。

本当の問題は、TFileStream を使用してファイル ハンドルを作成する方法でした。fmOpenRead または fmShareDenyWriteで開くように変更しました。これにより、ファイル ロックの問題であることが判明しました。

srcFile := TFileStream.Create(physicalFilename, fmOpenRead または fmShareDenyWrite);
于 2009-03-23T22:22:56.060 に答える
0

これについてはわかりませんが、おそらくこれは正しい方向に導くかもしれません: wininet DLL の URL キャッシュ関数を使用してみてください: FindFirstUrlCacheEntryFindNextUrlCacheEntryFindCloseUrlCacheを列挙に使用し、ローカル ファイル名が指定されたパスと一致するエントリを見つけた場合RetrieveUrlCacheEntryFileを使用してファイルを取得できます。

于 2008-09-26T12:15:12.210 に答える
0

IE によって作成されるサブディレクトリはランダムに生成されるため、毎回同じ名前が付けられるとは限りません。また、レジストリ メソッドで見られる問題は、ファイルがまだ存在する場合にのみ機能することです。キャッシュ内...キャッシュを空にすると、さらに別のインストールが必要なファイルが削除されます。

このヘルパーをアプリケーション データにインストールする方がよいのではないでしょうか?

于 2008-09-26T02:28:02.240 に答える
0

iexplore は、ファイル システム名ではなく、ファイルのシェル名前空間「名前」を渡しているようです。

コマンドラインでシェルアイテムIDを渡す方法が文書化されているとは思いません-エクスプローラー自体がそれを行いますが、シェルアイテムIDは(へのポインター)バイナリデータ構造であるため、マーシャリングに関する考慮事項があり、単一でのみ有効です処理する。

1. シェル名前空間のルート IShellFolder オブジェクトを返す SHGetDesktopFolder を呼び出します。2. IShellFolder::ParseDisplayName を呼び出して、与えられた名前をシェル アイテム ID リストに戻します。3. SHGDN_FORPARSING フラグを指定して IShellFolder::GetDisplayNameOF を試してください。「間違った」ファイルシステムの相対パスを返すことに最終的に責任を負うこのAPIだと思うからです。

于 2009-02-06T12:42:38.803 に答える
0

X-Appl ブラウザーで同様のシステムを使用して WAML Web アプリケーションを表示していますが、完全に機能します。たぶん、彼らがどうやってそれをやったかを見てみる必要があります。

于 2008-11-15T09:59:06.430 に答える