- ベストアンサー
親フォルダのIShellFolderインターフェースとアイテムIDの取得方法
SHBindToParent()関数でアイテムIDリストから親フォルダなどが取得できると MSDNで知り、ヘッダーファイル(shobj.h)とライブラリファイル(shell32.lib)を インクルードさせてみたのですが、関数が定義されていませんというメッセージが 表示されて使えません。 使用環境は以下のとおりです。 VC++6.0(SP5) Windows2000(SP2) SHELL32.DLL(5.00.3315.2902) 特別な設定をしないと(または、設定がなされてないと)使えないのでしょうか? 何方かご教授よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>現在、合計342MBのファイルをDL中なのですが、UpdateしたSDKを用いて作成した >アプリケーションでも別のパソコンで問題なく実行できるのでしょうか? 該当のバージョンのDLLがインストールされていれば動作します。 >あと、LoadLibrary、GetProcAddress関数の使い方なのですが、下記コードだと >パラメータ数に問題があるということでコンパイルができません。 FARPROCで関数ポインタを宣言しているためです。 VC++6.0ではSTRICTがデフォルトで定義されているので、 明示的に正しい関数の型宣言を定義しなければいけません //関数型の宣言(ヘッダに記述するのが普通) typedef HRESULT (WINAPI* SHBINDTOPARENT) ( LPCITEMIDLIST pidl, REFIID riid, VOID** ppv, LPCITEMIDLIST* ppidlLast ); //GetProcAddressの行を下のように変更 SHBINDTOPARENT lpDll = (SHBINDTOPARENT)GetProcAddress(hLib,"SHBindToParent");
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>とても勉強になりました。C/C++言語って奴は厄介者ですねぇ。 >MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。 WindowsAPIを直接使っている時点でMFCではなくなってますよ。 立派なWindowsSDKでの開発です。 >LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても >DLLのバージョンが合っていれば、このような用途が可能ってことですよね。 そうですね。 さらに、利点としては、使いたい関数が存在しないときに、自分でエラーを出してアプリを終了させることが出来ます。 普通にLIBをプロジェクトに加えてDLL内の関数を呼び出そうとしたときに関数が存在しないと、その時点でアプリケーションエラーで落ちますからね。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
もちろんLoadLibrary、GetProcAddressを使用すればSDKなくても呼び出せますので、 SHBindToParentしか使わなく、SDKをダウンロードしないといけないのであれば、LoadLibraryのほうが楽かも。
お礼
早速のご教授有難うございます。 現在、合計342MBのファイルをDL中なのですが、UpdateしたSDKを用いて作成した アプリケーションでも別のパソコンで問題なく実行できるのでしょうか? あと、LoadLibrary、GetProcAddress関数の使い方なのですが、下記コードだと パラメータ数に問題があるということでコンパイルができません。 もしよろしければ、あわせてご教授願えませんでしょうか? HINSTANCE hLib = LoadLibrary("SHELL32.DLL"); FARPROC lpDll = GetProcAddress(hLib,"SHBindToParent"); IShellFolder *psfParent; LPITEMIDLIST pidlItem; LPITEMIDLIST pidlRel; STRRET str; TCHAR szDisplayName[MAX_PATH]; HRESULT hres = lpDll(pidlItem,IID_IShellFolder,&psfParent,&pidlRel);
- taka_tetsu
- ベストアンサー率65% (1020/1553)
MSDNを見ると、shell32.dll version 5.00 or laterとかかれています。 で、VC++6.0の販売時期を考えてみてください。 存在しない関数についてはヘッダファイルは存在しません。 つまり、最新のWin32SDKをインストールする必要があります。 MSDNには入られていないのであれば、参考urlからダウンロードをしてください。(200M以上あります) あと、コンパイルする際に、WINVER、_WIN32_IE等の指定をする必要があります。 詳しくは下のurlを。 http://www.runan.net/program/tips/sdk_11_define_WINVER.shtml
お礼
とても勉強になりました。C/C++言語って奴は厄介者ですねぇ。 MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。 リストビューでエクスプローラもどきを作成しようとしているのですが、 無事(?)に一階層だけですが親フォルダが取得できました(階層が深くなると×)。 LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても DLLのバージョンが合っていれば、このような用途が可能ってことですよね。 度々のご教授ほんとうに有難う御座います。