開発環境がVisual C++ 2008 Express Editionでwin32APIを使って「フォルダの選択」ダイアログを表示するときのメモ書きです。

「フォルダ選択」ダイアログのサンプロプログラムを下のとおりです。(このサンプルプログラムはwin32工作部屋さんのサイト を参考にさせていただきました)

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

int WINAPI WinMain(HINSTANCE hInstCurrent, HINSTANCE hinstPrevious, LPSTR lpszCmdLine, int nCmdShow)
{
BROWSEINFO bi;
ITEMIDLIST *idl;
LPMALLOC g_pMalloc;
char szTmp[MAX_PATH];

SHGetMalloc(&g_pMalloc);

bi.hwndOwner =NULL;
bi.pidlRoot =NULL;
bi.pszDisplayName =szTmp;
bi.lpszTitle =TEXT("フォルダを選択してください");
bi.ulFlags =BIF_RETURNONLYFSDIRS;
bi.lpfn =NULL;
bi.lParam =0;
bi.iImage =0;
//ダイアログを表示
idl=SHBrowseForFolder(&bi);
if(idl != NULL)
{
if(SHGetPathFromIDList(idl,szTmp) != FALSE){
MessageBox(NULL,szTmp,TEXT("tips5"),MB_OK);
}
//PIDLを解放する
g_pMalloc->lpVtbl->Free(g_pMalloc,idl); //for c
//g_pMalloc->Free(idl); //for c++
}
return 0;
}

注意点は、コメント「PIDLを開放する」の下のコードです。

ソースファイルの拡張子が.cの場合、 「//for c」 の行でビルドできたのですが、拡張子が.cpp(C++)だと下のようなビルドエラーがでました。

error C2039: 'lpVtbl' : 'IMalloc' のメンバではありません。
~\objidl.h(965) : 'IMalloc' の宣言を確認してください。
error C2227: '->Free' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。

C++(拡張子が.cpp)では、「for c++」の行でコンパイルが通るようになります。

これは、Visual C++ではcとc++のコンパイラが用意されていて、拡張子が.cの場合はcのコンパイラ、c++の場合はC++のコンパイラがそれぞれコンパイルするみたいなのですが、cとc++ではAPIの呼び方が異なるためのようです。(上記サンプルではFreeの呼び方がcとc++では違う)

・win32を使ったwindowsプログラミング入門・初心者のためのおすすめ書籍の紹介
Windowsゲームプログラミング 第2版 Game Developer/赤坂 玲音
¥2,940
Amazon.co.jp

猫でもわかるWindowsプログラミング 第3版 (猫でもわかるプログラミングシリーズ)/粂井 康孝
¥2,940
Amazon.co.jp