アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

特別な設定をしないと(または、設定がなされてないと)使えないのでしょうか?
何方かご教授よろしくお願いします。

A 回答 (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");
    • good
    • 0
この回答へのお礼

とても勉強になりました。C/C++言語って奴は厄介者ですねぇ。
MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。

リストビューでエクスプローラもどきを作成しようとしているのですが、
無事(?)に一階層だけですが親フォルダが取得できました(階層が深くなると×)。
LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても
DLLのバージョンが合っていれば、このような用途が可能ってことですよね。

度々のご教授ほんとうに有難う御座います。

お礼日時:2002/07/29 21:45

>とても勉強になりました。

C/C++言語って奴は厄介者ですねぇ。
>MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。

WindowsAPIを直接使っている時点でMFCではなくなってますよ。
立派なWindowsSDKでの開発です。

>LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても
>DLLのバージョンが合っていれば、このような用途が可能ってことですよね。

そうですね。
さらに、利点としては、使いたい関数が存在しないときに、自分でエラーを出してアプリを終了させることが出来ます。
普通にLIBをプロジェクトに加えてDLL内の関数を呼び出そうとしたときに関数が存在しないと、その時点でアプリケーションエラーで落ちますからね。
    • good
    • 0

もちろんLoadLibrary、GetProcAddressを使用すればSDKなくても呼び出せますので、


SHBindToParentしか使わなく、SDKをダウンロードしないといけないのであれば、LoadLibraryのほうが楽かも。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/07/29 14:23

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_ …

参考URL:http://msdn.microsoft.com/downloads/default.asp, …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!