SHBindToParent()関数でアイテムIDリストから親フォルダなどが取得できると
MSDNで知り、ヘッダーファイル(shobj.h)とライブラリファイル(shell32.lib)を
インクルードさせてみたのですが、関数が定義されていませんというメッセージが
表示されて使えません。
使用環境は以下のとおりです。
VC++6.0(SP5)
Windows2000(SP2)
SHELL32.DLL(5.00.3315.2902)
特別な設定をしないと(または、設定がなされてないと)使えないのでしょうか?
何方かご教授よろしくお願いします。
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");
とても勉強になりました。C/C++言語って奴は厄介者ですねぇ。
MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。
リストビューでエクスプローラもどきを作成しようとしているのですが、
無事(?)に一階層だけですが親フォルダが取得できました(階層が深くなると×)。
LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても
DLLのバージョンが合っていれば、このような用途が可能ってことですよね。
度々のご教授ほんとうに有難う御座います。
No.4
- 回答日時:
>とても勉強になりました。
C/C++言語って奴は厄介者ですねぇ。>MFCでこれほどならSDKだと苦労するだろうなぁ(汗)。
WindowsAPIを直接使っている時点でMFCではなくなってますよ。
立派なWindowsSDKでの開発です。
>LoadLibrary(),GetProcAddress()関数のように、別に最新のSDKにしなくても
>DLLのバージョンが合っていれば、このような用途が可能ってことですよね。
そうですね。
さらに、利点としては、使いたい関数が存在しないときに、自分でエラーを出してアプリを終了させることが出来ます。
普通にLIBをプロジェクトに加えてDLL内の関数を呼び出そうとしたときに関数が存在しないと、その時点でアプリケーションエラーで落ちますからね。
No.2
- 回答日時:
もちろん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);
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_ …
参考URL:http://msdn.microsoft.com/downloads/default.asp, …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/10 11:34
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/10/26 17:14
- ネットワーク ネットワーク資格情報について 2 2022/08/05 12:50
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- Excel(エクセル) エクセルについて教えてください。 1 2023/02/23 10:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/24 08:33
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- Windows 10 ファイルエクスプローラーでフォルダを閉じる操作について 2 2022/10/15 11:06
- その他(開発・運用・管理) コマンドプロンプトまたはpower shellなどを用いてのフォルダ内のファイル一括リネーム方法をご 4 2022/10/24 09:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
C言語でヘッダファイルにグロー...
-
<math.h>があるのにsqrtが・...
-
ILSpyで、デコンパイルできない。
-
Makefile作成時の拡張子.oとは?
-
” OS ビルド ” の意味が分か...
-
PRO*C コンパイルエラー
-
1 つ以上の複数回定義されてい...
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
「fatal error C1189」を回避す...
-
includeと#include
-
ProCでコンパイルエラーが出ます
-
CImageクラスの使用について
-
sys/types.hの必要性について
-
ビルドとリビルドの違いを教え...
-
不要な #include
-
COBOLプログラムからC関数を呼...
-
C++コンパイル時に『 C1083: in...
-
複数のサブディレクトリを一緒...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
「fatal error C1189」を回避す...
-
C言語でヘッダファイルにグロー...
-
Makefile作成時の拡張子.oとは?
-
エクセルVBAではRound...
-
1 つ以上の複数回定義されてい...
-
コンパイルエラー:ユーザ定義...
-
セミコロンについて
-
ILSpyで、デコンパイルできない。
-
[c++] <pthread.h>がinclude で...
-
クリティカルエラー Expressio...
-
マクロ コンパイルがグレーバック
-
PRO*C コンパイルエラー
-
外部シンボル "_main"は未解決です
-
他のLinuxでも動くa.outの作り方
-
<math.h>があるのにsqrtが・...
-
戻り値について
-
pyc 編集 閲覧
-
C++コンパイル時に『 C1083: in...
おすすめ情報