P/

2012-04-30 3 views
3

だから私は、デバッグコンソールにすべての拡張ファイル属性をダンプするには、次のコードを使用しています... Shell32は同様P/

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は、バイパスInterop.Shell32.dll世代で起動しますDLLリソースをプログラムに直接埋め込むことはできず、interopヘルパーDLLを生成する必要があります。

shell32のこれらの関数のDLLImportコマンドラインについて知っていれば、相互運用性DLLの生成を回避できますか?私はpinvoke.netをチェックして、Shell32エントリーの下で、私が探しているものがないか、または私が期待している名前になっていない。

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

ありがとうございました!

+2

.NET 4+に組み込まれた相互運用機能を認識していますか? http://msdn.microsoft.com/en-us/library/dd997297.aspx –

+0

残念ながら、私は3.5を使用して立ち往生していますが、それはクールな機能です。 –

答えて

4

ほとんどのWindowsシェルAPI機能には、COMインターフェイスを返すP/Invokeエントリポイントがあるため、ShellClass CoClassインスタンスを明示的に作成する必要はほとんどありません。 (使用しているオブジェクトは、FolderFolderItemですが、スクリプト言語などのレイトバインドされたクライアントで使用することを主な目的としていますが、C#を使用するとより効果的です)。シェルが既に実装しているP/Invoke関数とCOMインターフェイスと一致するC#コードで適切な型を宣言する必要があります。あなたの場合、あなたが探しているのはIShellFolder2インターフェイスです(これは実質的にFolderオブジェクトと同じです)。通常

は、あなたが求めているものを行うには、次のようになります

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

2つのCOMインターフェイスに1つの構造体と1つのP/Invoke関数を変換し、プロジェクトにC#コードを挿入する必要があります。 COMメソッド間で渡す必要があるだけなので、多くの(PIDLのような)IntPtrを取得することができます。 (完了後にメモリを解放する必要があることをMSDNの記事で教えてくれるので、CLRのinteropコードはほとんどの場合、あなたに代わってこのようなことを処理します。)

pinvoke.netは、これは魅力的に書かれているように、series of blog postsはMSDNの記事からCOM相互運用機能の翻訳を行っています。

+0

Yikes!私はそれを適切な解決策として答えとしてマークするつもりですが、インストーラでDLLをパッケージ化するよりはるかに多くの作業を実装するために、1k行以上のコードを追加導入することを考えています。 –

+0

レイトバインドCOMはC#からすべて間違っています。本当に、しないでください。そして余分なコードは既に存在します。あなたはただそれを見つけるためにあなたのお気に入りの検索エンジンを使用する必要があります。 –

+0

それほど多くのコードはありません。おそらく100行のp/invoke.netからのコピー/ペーストがあなたにインターフェイスを提供します(ただし、IShellFolderがどのように翻訳されたかはわかりませんが、確かにうまくいくでしょう)。プロパティを取得するための実際のコードは、ほとんどあなたが持っているものから行ごとに変換します。私はしばらく時間を取って、実際のサンプルをやろうとします。 –

4

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

関連する問題