3

したがって、次のコードを使用して、すべての拡張ファイル属性をデバッグコンソールにダンプしています...

ShellClass shellClass = new ShellClass();
Folder dir = shellClass.NameSpace(Path.GetDirectoryName(sFilePath));
FolderItem item = dir.ParseName(Path.GetFileName(sFilePath));
for (int i = 0; i < 267; i++)
{
   System.Debug.WriteLine(dir.GetDetailsOf(item, i));
}

Shell32 は管理されていないライブラリであるため、プログラムに DLL リソースを直接埋め込むことはできず、相互運用ヘルパー DLL を生成する必要があります。

相互運用 DLL の全世代を回避するために、Shell32 のこれらの関数の DLLImport コマンド ラインを知っている人はいますか? pinvoke.net を確認しましたが、Shell32 エントリの下に、探しているものが含まれていないか、期待どおりの名前が付けられていません。

これを達成するために DLLImport を使用することができない場合、マネージ DLL を使用してファイルに関するすべての拡張属性を取得する方法、または少なくとも生成する必要がない場所でそれを行う方法を知っている人はいますか?ヘルパー DLL を作成し、開発中のアプリケーションにインストーラーが必要ですか?

本当にありがとう!

4

2 に答える 2

4

私の経験では、マネージ コードからシェル API を使用する最も効果的な方法は、Windows API Code Packを使用することです。これにより、シェル API の有用な部分がすべてまとめられ、マネージ コードから簡単にアクセスできるようになります。ダウンロードには、作業を進めるための多くの例が含まれています。

于 2012-05-02T00:29:52.260 に答える
4

ほとんどの Windows シェル API 機能には、COM インターフェイスを返す P/Invoke エントリ ポイントがあるため、ShellClass CoClass インスタンスを明示的に作成する必要はほとんどありません。(使用しているオブジェクト と はFolderFolderItemほとんどの場合、スクリプト言語などの遅延バインド クライアントで使用することを目的としています。C# を使用すると、はるかにうまく処理できます。)

相互運用アセンブリを生成する必要がないようにするには、シェルが既に実装している P/Invoke 関数と COM インターフェイスに一致する適切な型を C# コードで宣言するだけです。あなたの場合、探しているのはIShellFolder2インターフェイスです(これは本質的にFolderオブジェクトと同じです)。

通常、求めていることを行うには、次のようにします。

  1. デスクトップ フォルダーを指すインターフェイスSHGetDesktopFolderを返すために呼び出します。IShellFolder
  2. 必要なフォルダーを呼び出すIShellFolder::ParseDisplayNameと、そのフォルダーの内部シェル識別子を表す「識別子リストへのポインター」(PIDL) が得られます。
  3. IShellFolderあなたを にキャストしますIShellFolder2(as他のインターフェースと同様に を使用します)。
  4. を呼び出しIShellFolder2::GetDetailsOf()、手順 2 の PIDL と必要な列を渡します。

2 つの COM インターフェイスに加えて、1 つの構造体と 1 つの P/Invoke 関数を変換し、C# コードをプロジェクトに配置する必要があります。IntPtrCOM メソッド間でそれらを渡すだけでよいので、これ (PIDL など) の多くを回避できます。(MSDN の記事では、完了後にメモリを解放する責任があることが示されています。ほとんどの場合、CLR の相互運用コードがその処理を行います。)

pinvoke.net は、MSDN の記事からの COM 相互運用機能の変換に関するこの魅力的によく書かれた一連のブログ投稿と同様に、ここであなたを助けます。

于 2012-04-30T21:17:37.347 に答える