フォルダ参照ダイアログの検索開始点

[戻る]
mua 2002/11/22(金) 12:16:00
フォルダ参照ダイアログの検索開始点の設定の仕方ですが、
以下の記述の位置に、検索開始点を入力すればいいのですが、
相対パスを入力するとエラーが出てしまいます。

bi.pidlRoot         =NULL;          //検索開始点(nullならdesktop)

NULLの位置に"./"などのパスを入力すると、次のようなエラーがでました。
エラー:'char [3]' から 'const struct _ITEMIDLIST *'に変換することはできません。

どうすれば、ルートフォルダを検索開始点にできるのでしょうか。

mua 2002/11/22(金) 12:16:59
Win2000 VC6.0SP2 MFC
<対象:VC++ラウンジ>

開発環境を書き忘れてしまいました。
大変申し訳ございませんでした。
次回から気をつけます。

不良PG 2002/11/22(金) 12:36:22
わからなかったらとりあえず
Google等で
「SHBrowseForFolder」「使い方」
を検索しましょう。

くたくた 2002/11/22(金) 12:39:55
>どうすれば、ルートフォルダを検索開始点にできるのでしょうか。
下記のようなコードを試してみて下さい。(bi.pidlRootを使わない方法です)

int CALLBACK f( HWND hWnd, UINT iMsg, LPARAM, LPARAM lpData )
{
   if( iMsg == BFFM_INITIALIZED && lpData != NULL ){
       SendMessage( hWnd, BFFM_SETSELECTION, TRUE, lpData );
   }
   return 0;
}

bi.lParam = (LPARAM)初期フォルダパス名文字列へのポインタ
bi.lpfn   = f;

※ bi.pidlRootは直接「初期フォルダパス名文字列へのポインタ」
   を設定する物ではないです。

mua 2002/11/22(金) 23:59:54
> 下記のようなコードを試してみて下さい。(bi.pidlRootを使わない方法です)
確かめてみましたが、以下の2つのエラーが表示されます。

error C2440: '=' : 'int (__stdcall loView::*)(struct HWND__ *,unsigned
int,long,long)' から 'int (__stdcall *)(struct HWND__ *,unsigne
d int,long,long)' に変換することはできません。

error C2440: '=' : 'char [3]' から 'long' に変換することはできません。(新しい動
作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。

        bi.lpfn             =f;
        bi.lParam           =("./");
のように記述しましたが、記述ミスでしょうか。

くたくた 2002/11/23(土) 03:14:26
>記述ミスでしょうか。
そうです。

>error C2440: '=' : 'int (__stdcall loView::*) ...
fを通常の関数にして下さい。loViewのメンバ関数ではありません。

>error C2440: '=' : 'char [3]' から 'long' ...
(LPARAM)でキャストして下さい。

追伸:
上記は最低限自力で解決すべき事です。
まず C++文法とWinコーディングの基礎を固めて下さい。
「九九を覚えていないのに円の面積を求める」のは無理があります。
面倒かもしれませんが頑張って下さい。

mua 2002/11/23(土) 14:08:32
> 面倒かもしれませんが頑張って下さい。
まったくその通りです。
少しやってみて、できなかったらすぐに人に頼ってしまうのはよくありませんね。

fを通常の関数にしたら無事にできました。
しかし、フォルダは開きますが、そのフォルダが選択された状態ではありません。
どうしたら、フォルダ選択ダイアログが開くと同時に選択された状態にできるのでしょうか。

もしよかったら、f関数が何をしているのか教えていただきたいです。

mua 2002/11/24(日) 13:58:52
[[解決]]
> しかし、フォルダは開きますが、そのフォルダが選択された状態ではありません。
パスにファイル名が入っていたために選択されませんでした。
実行ファイル名を取り除いたら無事に選択されました。
コールバック関数の使い方が少しわかったような気がします。
ありがとうございました。

古いスレッドには追加発言できません。