Win32APIにおいて、避けられない型キャストで警告が出る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みそ油

Win32APIにおいて、避けられない型キャストで警告が出る

#1

投稿記事 by みそ油 » 10年前

コード:

wc.hIcon = static_cast<HICON>(LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED));
wc.hCursor = static_cast<HCURSOR>(LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED));
※wcは WNDCLASSEX 構造体のインスタンスです。

上記のキャストは、Win32APIにおいて避けられないものですが、Visual Studio 2015 でビルドすると警告を出されてしまいます。
LoadIcon, LoadCusor 関数を使う以外で、警告が出ないようにする方法はないのでしょうか。
ちなみに、static_cast を reinterpret_cast にしても、やはり警告がでました。

警告の内容は下記のとおりです。
warning C4302: '型キャスト': 'LPWSTR' から 'WORD' へ切り詰めます。

ISLe()

Re: Win32APIにおいて、避けられない型キャストで警告が出る

#2

投稿記事 by ISLe() » 10年前

その警告は、MAKEINTRESOURCEマクロに対してWORDの値を与えるべきところを、LPWSTRの文字列型を与えているために出力されているものだと思います。

リソースIDには値型と文字列型があります。

リソースファイルでIDが数値に変換できない識別子を持つ場合や、ダブルクォーテーションで囲われている場合に文字列型となります。

文字列型のリソースIDの場合は、MAKEINTRESOURCEマクロを使用せず、リソースIDの文字列をそのまま指定します。


IDI_APPLICATIONやIDC_ARROWがプリプロセッサにより数値に置き換えられるのが本来期待されているのだと思います。
そのマクロ定義が欠けているのではないでしょうか。

みそ油

Re: Win32APIにおいて、避けられない型キャストで警告が出る

#3

投稿記事 by みそ油 » 10年前

回答ありがとうございます。
Visual studio 上で、IDI_APPLICATION, IDC_ARROW がマクロ定数として(紫色に)ハイライトされています。
したがって、IDI_APPLICATION, IDC_ARROW の定義は windows.h 上、あるいは windows.h がインクルードしているファイル上に定義されているものと思われます。
調べてみたところ、実際に WinUser.h 上で、IDI_APPLICATION, IDC_ARROW ともに MAKEINTRESOURCE(32512) と定義されていました。

ISLe()

Re: Win32APIにおいて、避けられない型キャストで警告が出る

#4

投稿記事 by ISLe() » 10年前

既定のIDであること失念してました。
みそ油 さんが書きました:調べてみたところ、実際に WinUser.h 上で、IDI_APPLICATION, IDC_ARROW ともに MAKEINTRESOURCE(32512) と定義されていました。
そうすると既にMAKEINTRESOURCEマクロで変換されているわけなので
wc.hIcon = static_cast<HICON>(LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED));
ではなく
wc.hIcon = static_cast<HICON>(LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED));
という記述になるかと。

みそ油

Re: Win32APIにおいて、避けられない型キャストで警告が出る

#5

投稿記事 by みそ油 » 10年前

確かに、仰るとおりですね。
初めに挙げたコードが書籍に記載されていたので、こちらも盲目的にそれを信用してしまいました。
MAKEINTRESOURCEマクロ を取り払ったところ、警告が出なくなりました。ありがとうございました。
当質問は「解決」とさせていただきます。

みそ油

Re: Win32APIにおいて、避けられない型キャストで警告が出る

#6

投稿記事 by みそ油 » 10年前

解決にするのを忘れていました。失礼いたしました。

閉鎖

“C言語何でも質問掲示板” へ戻る