• ベストアンサー

親フォルダのIShellFolderインターフェースとアイテムIDの取得方法

SHBindToParent()関数でアイテムIDリストから親フォルダなどが取得できると MSDNで知り、ヘッダーファイル(shobj.h)とライブラリファイル(shell32.lib)を インクルードさせてみたのですが、関数が定義されていませんというメッセージが 表示されて使えません。 使用環境は以下のとおりです。    VC++6.0(SP5)    Windows2000(SP2)    SHELL32.DLL(5.00.3315.2902) 特別な設定をしないと(または、設定がなされてないと)使えないのでしょうか? 何方かご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>現在、合計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");

stussy
質問者

お礼

とても勉強になりました。C/C++言語って奴は厄介者ですねぇ。 MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。 リストビューでエクスプローラもどきを作成しようとしているのですが、 無事(?)に一階層だけですが親フォルダが取得できました(階層が深くなると×)。 LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても DLLのバージョンが合っていれば、このような用途が可能ってことですよね。 度々のご教授ほんとうに有難う御座います。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>とても勉強になりました。C/C++言語って奴は厄介者ですねぇ。 >MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。 WindowsAPIを直接使っている時点でMFCではなくなってますよ。 立派なWindowsSDKでの開発です。 >LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても >DLLのバージョンが合っていれば、このような用途が可能ってことですよね。 そうですね。 さらに、利点としては、使いたい関数が存在しないときに、自分でエラーを出してアプリを終了させることが出来ます。 普通にLIBをプロジェクトに加えてDLL内の関数を呼び出そうとしたときに関数が存在しないと、その時点でアプリケーションエラーで落ちますからね。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

もちろんLoadLibrary、GetProcAddressを使用すればSDKなくても呼び出せますので、 SHBindToParentしか使わなく、SDKをダウンロードしないといけないのであれば、LoadLibraryのほうが楽かも。

stussy
質問者

お礼

早速のご教授有難うございます。 現在、合計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)
回答No.1

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

参考URL:
http://msdn.microsoft.com/downloads/default.asp,http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

関連するQ&A