ディレクトリ選択ダイアログの表示

今回はディレクトリを選択する下の画像のようなダイアログを表示する命令を紹介したいと思います。

命令の形は以下のようになります
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi);

命令一つですむので楽そうですね。とりあえず構造体の中身を見てみましょう。

typedef struct _browseinfo { 
    HWND hwndOwner;          // 親ウィンドウのハンドル
    LPCITEMIDLIST pidlRoot;  // ルートにする場所を指定。NULLを指定するとデスクトップがルートにくる
    LPSTR pszDisplayName;    // 選択されたフォルダ名(フルパスではない)が格納される。
    LPCSTR lpszTitle;        // ダイアログに表示するメッセージ
    UINT ulFlags;            // どのフォルダを選択させるかのオプション
    BFFCALLBACK lpfn;        // 
    LPARAM lParam;           // 
    int iImage;              //  
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; 

ただダイアログを表示して、選択されたフォルダのフルパスを取得したいだけなら、下の3つは NULLと0でいいはずです

次に選択されたディレクトリのフルパスを取得する方法ですが、SHBrowseForFolderの返戻値とフルパスを受け取る文字列を引数にして SHGetPathFromIDListを呼び出します。最後にCoTaskMemFreeを呼び出してITEMIDLISTを解放します。
以下にプログラムリストを掲載します。

#include<windows.h>
#include<shlobj.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
				   LPSTR lpszCmdLine,int nCmdShow)

{  
    char name[100],dir[100];
    BROWSEINFO  binfo;
    LPITEMIDLIST idlist;
    
    binfo.hwndOwner=NULL;
    binfo.pidlRoot=NULL;
    binfo.pszDisplayName=name;
    binfo.lpszTitle="選択しよう";
    binfo.ulFlags=BIF_RETURNONLYFSDIRS; 
    binfo.lpfn=NULL;              
    binfo.lParam=0;               
    binfo.iImage=0;
    
    if((idlist=SHBrowseForFolder(&binfo))==NULL)
        MessageBox(NULL,"ディレクトリ選択されませんでした","キャンセル",MB_OK);
    else
    {
        SHGetPathFromIDList(idlist,dir);       
        MessageBox(NULL,name,"フォルダ名",MB_OK);
        MessageBox(NULL,dir,"フルパス",MB_OK);
        CoTaskMemFree(idlist);               
    }
    return 1;
}

一つ言い忘れていましたが、shlobj.hをインクルードさせないと動きませんので 忘れずにしておいてください。

戻る