ページ 11

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

Posted: 2015年6月21日(日) 17:14
by みそ油

コード:

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' へ切り詰めます。

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

Posted: 2015年6月21日(日) 17:47
by ISLe()
その警告は、MAKEINTRESOURCEマクロに対してWORDの値を与えるべきところを、LPWSTRの文字列型を与えているために出力されているものだと思います。

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

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

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


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

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

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

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

Posted: 2015年6月21日(日) 18:30
by ISLe()
既定の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において、避けられない型キャストで警告が出る

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

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

Posted: 2015年6月21日(日) 18:59
by みそ油
解決にするのを忘れていました。失礼いたしました。