- - PR -
ディレクトリ名の取得
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ); この結果が失敗してしまいます。 |
|
投稿日時: 2002-11-23 09:20
ITEMIDLISTの中身は利用しないと仮定して、
extern static IntPtr SHBrowseForFolder(ref BrowseInfo bi); extern static bool SHGetPathFromIDList(IntPtr pidl, StringBuilder pszPath); ではどうでしょう? |
|
投稿日時: 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