実現したいこと
・今までC++Builderの色々なバージョンでプログラミングしてきましたが、10.3までは気付かなかったのですが、11.3 にてプログラムすると、Windows API関数のところで、警告が出ていることに気付きました。WindowsAPI関数にはA型(ナロウ文字型)とW型(ワイド文字型)と分かれている関数で警告表示されています。勿論警告をなくしたいのが目標です。
発生している問題・分からないこと
・C++Builder11.3 VCL 環境で、Windows API 関数がA型(ナロウ文字型)を要求していることです。警告は出ますが、ビルドしてもエラーは出ずに、動作は特に問題は内容です。
・説明しやすいように以前のバージョンで検討用に作成したショートプログラムを探したところ、以下のリストでも再現できましたので掲載します。但し本件の問題自体はプログラム内容に直接は関係していないと思います。
・マウスをWindows API関数に移動すると、以下の警告メッセージが表示されます。他のAPI関数でも同様です。
警告メッセージ: 下記(1)を参照ください。
本来 SHGetFileInfo のまま使用できるはずではありますが、強制的にW型(SHGetFileInfoW)を指定しても警告メッセージが出ます。(2)を参照ください。
警告メッセージ: 下記(2)をご参照ください。
W型に設定しても警告が出るのは深刻な気がします。
どの様にすれば、Windows API 関数を警告なく使用できるのかご教授ください。お願いします。
問題の本質は、プログラムの内容には関係なく、IDEツールの環境設定が関係しているのかと考えています。
エラーメッセージ
error
1警告メッセージ(1): no matching function for call to SHGetFileInfoA 2警告メッセージ(2): no matching function for call to SHGetFileInfoW
該当のソースコード
#include <vcl.h> #include <windows.h> #include <shellapi.h> #pragma hdrstop #include "Unit1.h" void __fastcall TForm1::Button1Click(TObject *Sender) { if (OpenDialog1->Execute()){ TIcon *icon = new TIcon; SHFILEINFO fileinfo = {0}; SHGetFileInfo(OpenDialog1->FileName.c_str(), 0, &fileinfo, sizeof(fileinfo), SHGFI_ICON | SHGFI_LARGEICON); icon->Handle = fileinfo.hIcon; Image1->Picture->Icon->Assign(icon); delete icon; } }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
■1.C++Builderのバージョン違いによる比較
上記のリストを以下のように設定変更してビルドし確認をしました。プログラムリスト自体はどの条件でも同一です。
(1) バージョン10.3、32bit(Release)で、以前作成したリストをそのまま使いビルドしましたがエラーなく動作も問題ない。警告表示もなし。
マウスを SHGetFileInfo の所に持っていっても警告など何も表示されません。
(2) バージョン11.3、64bit(Release)で、上記(1)のソースをそのまま使い、ビルドと動作には問題はないですが、警告が発生しました。64ビットでのビルドはバージョン11.3で初めて行いました。
(3) バージョン11.3、32ビット(Release)/64ビット(Release)で、新たなファイルでプロジェクトを作り(1)のソースをマニュアルでコピーし実行したところ、ビルド及び動作は問題ないが、警告(1)が発生しました。
・上記の結果から、C++BuilderのバージョンによるUNICODEの扱いが変わっているようですが、本件に関係する情報は見つかりませんでした。
■2.プロジェクト>オプション>C++(共通オプション)でのインクルードパス と ライブラリパスの確認
C++Builder 11.3は標準インストールしただけでカスタマイズはしていませんが、パスの設定は以下のようになっています。
・Debug構成・32ビット: インクルードパス: $(BDSINCLUDE)\windows\vcl
・Debug構成・32ビット: ライブラリパス: $(BDSLIB)$(PLATFORM)$(CC_SUFFIX)\debug;$(BDSLIB)$(PLATFORM)\debug
・Release構成・32ビット: インクルードパス: $(BDSINCLUDE)\windows\vcl
・Release構成・32ビット: (空白)
・Debug構成・64ビット: インクルードパス: $(BDSINCLUDE)\windows\vcl
・Debug構成・64ビット: ライブラリパス: $(BDSLIB)$(PLATFORM)\debug
・Release構成・64ビット: インクルードパス: $(BDSINCLUDE)\windows\vcl
・Release構成・64ビット: (空白)
■3.Unicode設定
#include <windows.h> には以下の構文があるので、本来ならばUnicode 対応に問題はないはずですがWindows API関数でA型(ナロウ文字型)として認識され、W型(ワイド文字型)と認識されません。
#if defined(CODEGEARC)
ifndef _WIN32_WINNT
define _WIN32_WINNT 0x0500 /* If not set, assume NT 5.00 */
endif
if defined(__cplusplus)
define NOMINMAX /* for WINDEF.H */
else
define NONAMELESSUNION /* for OAIDL.H, OBJIDL.H,... */
endif
if defined(_UNICODE)
if !defined(UNICODE)
define UNICODE
endif
endif
#endif /* CODEGEARC */
念のため以下の指定を追加したところ、Unicodeの2重定義エラーが出ましたのでUnicode指定はされていると判断しています。
#define UNICODE //(追加)
#define _UNICODE //(追加)
#include <windows.h>
補足
C++Builder 11.3 は現状 Community Edition でこうした問題が生じているので有料版へのアップグレードを躊躇しています。現在は既にバージョンが12.xxですが。
念のため、ChatGPT 4oでも確認したところ、IDEの設定の見直しを勧められ、上記の通りパスを確認しました。さらに提案がありパスを追加しましたが今度はエラーが多数出てらちがあかない状況に至りました。
問題のキーは、バージョンによるビルド後のプロジェクトファイルの内容の違いにあるように感じています。
標準インストールで本件の問題が生じているのに、関連情報がネット上にないのは何故かなと合点がいっていないのも事実です。以上何卒ご教示賜りたくお願いいたします。
質問の要点はいかです。
1: 警告を止める方法
2: インクルードとライブラリのパスの設定のご確認
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/08/13 04:04
2024/08/13 08:43