開発環境が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プログラミング入門・初心者のためのおすすめ書籍の紹介
「フォルダ選択」ダイアログのサンプロプログラムを下のとおりです。(このサンプルプログラムは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