>> ボタンの上の表示は別に必要ないのですが、なぜか表示されて
>> いるので使ってます。
>ご自分で『SetDlgItemText(IDC_KARI,pszBuffer);』で設定しているのでは。。。?
いまの所この方法でしか場所が表示されないので、しています。他のプログラムを真似
ながらやっているのであまりわかっていない感じなのです。
選択したものは
void CSampleDlg::OnBnClickedButton1()
{
//「フォルダの参照」ダイアログを表示する
LPMALLOC pMalloc;
//Shellの標準のアケロータを取得する
if(::SHGetMalloc(&pMalloc) == NOERROR)
{
BROWSEINFO bi;
TCHAR pszBuffer[MAX_PATH];
LPITEMIDLIST pidl;
bi.hwndOwner = GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = pszBuffer;
bi.lpszTitle = _T(ファイルを検索するフォルダを)
_T(選択してください);
bi.ulFlags = BIF_RETURNFSANCESTORS |
BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
//ダイアログ ボックスを表示する。
if((pidl = ::SHBrowseForFolder(&bi)) != NULL)
{
if(::SHGetPathFromIDList(pidl,pszBuffer))
{
SetDlgItemText(IDC_KARI,pszBuffer);
}
pMalloc->Free(pidl);
}
pMalloc->Release();
}
}
で選択しています。
フォルダ選択ダイアログで指定されたファイル(のパス)を、取得したいのですよね?
やはり、pszBufferに格納されているかと。
サンプルソースをそのままコピーするのも、一つの手だとは思いますが、
何をやっているか理解してコピーしなければ、あとで大変な苦労をしますよ。
また、画面に表示されたからOK/動いたからOK。とするのではなく、
「なぜ動いたのか」を理解しなければ、ステップアップに繋がりませんし、
大変な危険を持ったソースになりかねません。
CString path = C:\\windows;
path += \\*.*;
で、C:\\windows;をpszBuffer;にって事ですよね?それだとリストビュー内に何も
表示されませんでした。
>サンプルソースをそのままコピーするのも、一つの手だとは思いますが、
>何をやっているか理解してコピーしなければ、あとで大変な苦労をしますよ。
アドバイスありがとうございます。その場しのぎでは何もならないのはわかります。基
本からコツコツがんばりたいと思います。
>また、画面に表示されたからOK/動いたからOK。とするのではなく、
>「なぜ動いたのか」を理解しなければ、ステップアップに繋がりませんし、
>大変な危険を持ったソースになりかねません。
確かに出来上がりだけ満足して、過程の重要さを忘れているかもしれません。今の所、
あまり危険さがわかっていないので、もしかしたら今後の大失敗につながるのかもしれ
ません。一文、一文見ながらやっていきたいと思います。
> C:\\windows;をpszBuffer;にって事ですよね?
もしかして、
CString path = pszBuffer;
とやってます?
それでは、pathにpszBufferとしか入らないです。
ダブルクォーテーション( )で囲むと、文字列として認識され、変数として機能しませ
んよ。
あと一点確認したいのですが、デバッグで動かしたとき、pszBufferにちゃんとパスが
入ってますか?
・・・
//ダイアログ ボックスを表示する。
if((pidl = ::SHBrowseForFolder(&bi)) != NULL)
{
if(::SHGetPathFromIDList(pidl,pszBuffer))
{
SetDlgItemText(IDC_KARI,pszBuffer); ←ココでブレークポイント
}
pMalloc->Free(pidl);
}
・・・
すいません、遅れました。
CString path = pszBuffer;
としたら、リストビューにローカルディスク(C:)の中身が表示されていました。とりあ
えず、OKです。
> SetDlgItemText(IDC_KARI,pszBuffer); ←ココでブレークポイント
と、した所、
自動変数の値が0*0012f414フフフフフ…
型がchar[260]
となっていました。この、フフフは以前も出た事あります。
これからしたい事は、実行した時に、はじめはリストビュー内に何も表示されていない
状態で、フォルダ選択ダイアログで指定した自分の好きなファイルを選択した後にその
選択したファイルがリストビュー内に表示されるようなものができれば完成なのです
が。
> この、フフフは以前も出た事あります。
単に領域を初期化しないと、VCではある特定の値が入るようになっているからです。
(デバッグ版のみだったかな。)
気持ち悪いならば、memsetで初期化するなり、宣言時に初期化するなりしてください。
> TCHAR pszBuffer[MAX_PATH];
TCHAR szBuffer[ MAX_PATH ] = _T( " );
ちなみに、ポインタ型変数でないのであれば、変数の頭にpをつけないほうがよいかも。
>>また、画面に表示されたからOK/動いたからOK。とするのではなく、・・・
> ・・・
> としたら、リストビューにローカルディスク(C:)の中身が表示されていました。
> とりあえず、OKです。
危険ですよ~
特に、
SetDlgItemText(IDC_KARI,pszBuffer);
のブレークポイントでパスが入っていないのに、なぜ、
CString path = pszBuffer;
で入るのか?かなり怪しい動きをしていませんか。。。?
# 上記がどこにあるか不明ですが。
はなさんのご発言から察するに、おそらく「これからしたい事」は、
今までの技術で実現できると思いますよ。
あとは、それぞれの関数/アルゴリズムが、
どのような動きをするかを調べ整理し(すでに組んであるところも含め)、
不明なところはMSDNやGoogle等で調べ、うまく組み合わせることが出来れば、
見事完成できるかと。
また、危険な事をしていたみたいですね。すいません。謝るよりも自分の為に改善しな
きゃいけないですね。
関数を足したり、教えてもらって自力ではありませんでしたが、完成しました。
三草さん、みなさんありがとうございました。
またどこかで…。勉強になりました。