- PR -

ディレクトリ名の取得

1
投稿者投稿内容
andy
会議室デビュー日: 2002/11/22
投稿数: 13
投稿日時: 2002-11-22 16:25
システムAPIのSHBrowseForFolderとSHGetPathFromIDListを使ってディレクトリ名を取得しようと思ってます。
あと少しという所までいったのですが、そのあと少しが解決できません。
もし、ご存知の方がいらっしゃったら教えて頂ければ大変うれしいです。
よろしくお願いします。

<やったこと>
SHBrowseForFolderに関しては、
[StructLayout(LayoutKind.Sequential)]
public struct BROWSEINFO
{
...中身の素直な記述
}
[DllImport( "shell32.dll" )]
static extern ITEMIDLIST SHBrowseForFolder( ref BROWSEINFO lpbi );

としておいて、
BROWSEINFO binfo = new BROWSEINFO();
binfo.pszDisplayName = new string( ' ', 256 );
binfo.lpszTitle = "";
binfo.ulFlags = 0x0001;
ITEMIDLIST idlist = SHBrowseForFolder( ref binfo );
を実行すると、例のダイアログが出てきて、ディレクトリを選択できます。
この時、C++で同じ記述をした時(同じようなコードをC++プロジェクトで
作ってみました)と同じような内容がbinfoに格納されているので、OKのようです。

問題は、返り値をITEMIDLISTに格納する時に起こっているようですが、
いろいろ試行錯誤してみたんですが、Marshalingがうまくいかないようで
StringBuilder dir = new StringBuilder( 260 );
bool ret = SHGetPathFromIDList( idlist, dir );
この結果が失敗してしまいます。
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2002-11-23 09:20
ITEMIDLISTの中身は利用しないと仮定して、

extern static IntPtr SHBrowseForFolder(ref BrowseInfo bi);
extern static bool SHGetPathFromIDList(IntPtr pidl, StringBuilder pszPath);

ではどうでしょう?
andy
会議室デビュー日: 2002/11/22
投稿数: 13
投稿日時: 2002-11-26 10:07
ご教授、ありがとうございました!
結論を申し上げると、それで問題なく動きます!

実は...
過去の会議室の記録を見ていて、
http://cgi.www5b.biglobe.ne.jp/~yone-ken/cgi-bin/vbnote/jawanote.cgi
上記のページの参照を発見しました。
そこで記述してある方法が、NothingBut.NETFXさんが教えて下さった方法と同じものだったです。
その時、試したんですが、昔のゾンビコードがあって、
本当は、素直に
[DllImport( "shell32.dll" )]
static extern IntPtr SHBrowseForFolder( ref BROWSEINFO lpbi );
としなければいけない所を、

[DllImport( "shell32.dll" )]
[return : MarshalAs(UnmanagedType.LPStruct)]
static extern IntPtr SHBrowseForFolder( ref BROWSEINFO lpbi );
としてしまっていました。

Marshalingって、相当適当にやってもうまくいくみたいだけど、
厳密にする方法もあって、試行錯誤しているうちに、はまってました。(^^

お騒がせしてすみませんでした。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)