質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

2回答

448閲覧

Windows API各種関数での C++Builder の Unicode 対応方法について教えてください

yun.nishi

総合スコア5

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2024/07/27 14:38

実現したいこと

・今まで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: インクルードとライブラリのパスの設定のご確認

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

[香車]東上☆あらし☆海美「
直接、C++Builder 開発元の

https://www.embarcadero.com/jp/
Embarcadero Cross-Platform App Development Software(ja)

で、聞いたほうがいいと思います。

投稿2024/08/09 01:57

umimi

総合スコア504

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yun.nishi

2024/08/13 04:04

ご回答ありがとうございます。ごもっともですね。 質問してから開発環境の再インストールなど環境の見直しもしましたが解決には至りませんでした。 そうこうしている内に先週最新バージョンをインストールすることになり、pathの設定も修正され、問題提起した現象が一応解決できたようです。 お騒がせしました。皆さんありがとうございました。
dodox86

2024/08/13 08:43

@質問者 yunさん > そうこうしている内に先週最新バージョンをインストールすることになり、pathの設定も修正され、問題提起した現象が一応解決できたようです。 > お騒がせしました。皆さんありがとうございました。 何らかの方法によってご自身で一定の解決を得られたのであれば、その情報をご自身で投稿して自己解決とするか、いただいた回答にベストアンサーを付けて質問を閉じてください。
guest

0

C++ Builder(RAD Studio)は使ったことないですが、Windows API呼び出しの考え方はVisual C++(Visual Studio)と同じだと思うので、参考まで。

プロジェクトのオプションで、「_TCHARのマップ先」の設定は「wchar_t」「char」のどちらになっていますか?
C++ Builderのバージョンによって、デフォルトが変わった可能性は無いでしょうか?
(あるいはプロジェクトにより、デフォルト以外を選択しているとか)

wchar_t

  • UNICODE、_UNICODEがdefineされる
  • APIをA/W無しで呼び出すと、~Wが呼び出される
  • APIの引数や戻り値の文字コードはUTF-16

char

  • UNICODE、_UNICODEがdefineされない
  • APIをA/W無しで呼び出すと、~Aが呼び出される
  • APIの引数や戻り値の文字コードはShift_JIS

※Visual Studioのプロジェクトのプロパティでは、「文字セット」で「Unicode文字セットを使用する」「マルチバイト文字セットを使用する」に相当

投稿2024/07/27 18:47

hiroki-o

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yun.nishi

2024/07/28 02:48

早速のご回答ありがとうございます。 C++Builderでの環境設定で、_TCHARのマップ先はいつもwchar_tにマップしています。 以前は_TCHAR表記を使っていましたが、Windows API 関数がユニコードに対応している現状ではもっぱら String str = L"文字列"; のようにユニコードに固定してコーディングしています。その他の設定でも特に変更したとは認識していません。又環境設定ではUNICODEが設定されています。 なおC++Builderは文字通りRadであり使い始めると手放せなくなりますが、たまにバージョンが更新されると不具合に出くわすことがあり今回もそうなのかなと懸念しています。 今回の質問では気に掛けていただき誠にありがとうございました。引き続き本件解決に向けて広く情報をお待ちしております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問