フォルダ選択ダイアログの作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
basuku

フォルダ選択ダイアログの作成

#1

投稿記事 by basuku » 9年前

お世話になります。
フォルダ選択ダイアログを作成しているのですがリンク時にエラーが発生いたします。

コード:

		 void a(void) {
			//フォルダ参照ダイアログインスタンス生成
			 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::Show(NULL,szTmp,TEXT("tips5"),MB_OK);
				 }
				 //PIDLを開放する
				 g_pMalloc->Free(idl);
			 }

コード:

test.obj : error LNK2028: 未解決のトークン (0A00000F) "extern "C" int __stdcall SHGetPathFromIDListA(struct _ITEMIDLIST const *,char *)" (?SHGetPathFromIDListA@@$$J18YGHPBU_ITEMIDLIST@@PAD@Z) が関数 "private: void __clrcall a::Form_Main::a(void)" (?a@Form_Main@test@@$$FA$AAMXXZ) で参照されました。
test.obj : error LNK2028: 未解決のトークン (0A000010) "extern "C" struct _ITEMIDLIST * __stdcall SHBrowseForFolderA(struct _browseinfoA *)" (?SHBrowseForFolderA@@$$J14YGPAU_ITEMIDLIST@@PAU_browseinfoA@@@Z) が関数 "private: void __clrcall test::Form_Main::a(void)" (?a@Form_Main@test@@$$FA$AAMXXZ) で参照されました。
test.obj : error LNK2028: 未解決のトークン (0A000011) "extern "C" long __stdcall SHGetMalloc(struct IMalloc * *)" (?SHGetMalloc@@$$J14YGJPAPAUIMalloc@@@Z) が関数 "private: void __clrcall test::Form_Main::a(void)" (?a@Form_Main@test@@$$FA$AAMXXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall SHGetPathFromIDListA(struct _ITEMIDLIST const *,char *)" (?SHGetPathFromIDListA@@$$J18YGHPBU_ITEMIDLIST@@PAD@Z) が関数 "private: void __clrcall test::Form_Main::a(void)" (?a@Form_Main@test@@$$FA$AAMXXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル "extern "C" struct _ITEMIDLIST * __stdcall SHBrowseForFolderA(struct _browseinfoA *)" (?SHBrowseForFolderA@@$$J14YGPAU_ITEMIDLIST@@PAU_browseinfoA@@@Z) が関数 "private: void __clrcall test::Form_Main::a(void)" (?a@Form_Main@test@@$$FA$AAMXXZ) で参照されました。
test.obj : error LNK2019: 未解決の外部シンボル "extern "C" long __stdcall SHGetMalloc(struct IMalloc * *)" (?SHGetMalloc@@$$J14YGJPAPAUIMalloc@@@Z) が関数 "private: void __clrcall test::Form_Main::a(void)" (?a@Form_Main@*****@@$$FA$AAMXXZ) で参照されました。
F:\ツール : fatal error LNK1120: 外部参照 6 が未解決です。
調べても対処方法がよくわかりませんでした。
よろしくお願いします。
環境:WindowsXP,VisualStudio2008

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: フォルダ選択ダイアログの作成

#2

投稿記事 by softya(ソフト屋) » 9年前

Shell32.libはリンク対象に追加されていますでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

basuku

Re: フォルダ選択ダイアログの作成

#3

投稿記事 by basuku » 9年前

リンクを追加したら通りました。ありがとうございます。
因みに、エラー内容でこれが足りないとかわかるんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: フォルダ選択ダイアログの作成

#4

投稿記事 by softya(ソフト屋) » 9年前

>因みに、エラー内容でこれが足りないとかわかるんですか?

まず、「未解決の外部シンボル」と出ているのでリンクで足らないものがあると分かります。
で、「SHBrowseForFolder MSDN」でググルとMSDNページ(英語)があります。
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
で下の方を見ていくと「ライブラリ Shell32.lib」と書いてあるのでShell32.libが必要とわかるわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: フォルダ選択ダイアログの作成

#5

投稿記事 by YuO » 9年前

ところで,__clrcallということはC++/CLIでしょうか。
であれば,FolderBrowserDialog クラス (System.Windows.Forms) を使えば済みそうですが……。

basuku

Re: フォルダ選択ダイアログの作成

#6

投稿記事 by basuku » 9年前

>>softyaさん
わかりました、今後参考に致します。

>>YuOさん
ネットで適当に調べた方法だったんで。
FolderBrowserDialogクラスのほうが実装が楽なんでしょうかね?

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: フォルダ選択ダイアログの作成

#7

投稿記事 by YuO » 9年前

basuku さんが書きました:FolderBrowserDialogクラスのほうが実装が楽なんでしょうかね?
C++/CLI前提で,FolderBrowserDialogクラスで可能であれば,明らかにFolderBrowserDialogの方が楽です。

先のMSDNのVisual C++のサンプルコードを見て貰えればわかると思いますが,実質的には,

コード:

FolderBrowserDialog^ folderBrowserDialog1 = gcnew System::Windows::Forms::FolderBrowserDialog;
folderBrowserDialog1->Description = "Select the directory that you want to use as the default.";
folderBrowserDialog1->ShowNewFolderButton = false;
folderBrowserDialog1->RootFolder = Environment::SpecialFolder::Personal;
System::Windows::Forms::DialogResult result = folderBrowserDialog1->ShowDialog();
if ( result == ::DialogResult::OK )
{
    folderName = folderBrowserDialog1->SelectedPath;
}
で呼び出しとパスの取得をしています (隠れてfolderBrowserDialog1->Dispose();がありますが)。
OpenFileDialogなどもそうですが,C++/CLI使っているのであれば,.NET Framworkのクラスで間に合う範囲ならば使ってしまった方が楽になることの方が多いです。

閉鎖

“C言語何でも質問掲示板” へ戻る