none
HWND_BROADCASTの64bitビルド時の警告(C4306)について RRS feed

  • 質問

  • Visual Studio&Windows開発初級者ですm(__)m

    現在、既存の32bitアプリを64bit化しているのですが、64bitビルドを行うと

    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

    の部分で「warning C4306 intからより大きいサイズのHWNDへ変換します。」

    の指摘を受けてしまいます。

    HWND_BROADCASTがHWND型で64bit化によりbit長が64bitになったための警告だと思うのですが、

    HWND_BROADCASTの定義が、WinUser.hで#define HWND_BROADCAST  ((HWND)0xffff)

    となっているため、アプリ側でどのように警告を除去したらよいのか、もしくは警告が除去できない(そんなことがあるの?)

    をご教授いただけないでしょうか。

    環境はWindows 7 Ultimate SP1 (x64)

    Visual Studio 2008 Pro SP1です。

    よろしくお願いいたします。

    2011年4月25日 7:21

回答

  • 再現できました。
    (HANDLE)(0xffff);
    と入れるだけでもでますね

    なぜこの条件ででるのかはわからないです。
    警告レベルを変えるか、

    #pragma warning(disalbe:4306)

    で回避するするぐらいしかないかもしれません

     

    • 回答としてマーク seed-ceed 2011年5月13日 8:03
    2011年5月10日 11:08
  • #define HWND_BROADCAST  ((HWND)0xffff)
    と定義されていますが64bitでは以下のような定義になっていないと、このWarninigが出るようです。
    #define HWND_BROADCAST  ((HWND)0xffffULL)
    原因は分かりません。
    対処方法はすでにご提案の方法を使うか、C++でCompileすることぐらいでしょうか。
    自分でHWND_BROADCASTを定義しなおしても良いですが、今後変更があったら困りますね。
     
    また、#pragma warning(disalbe:4306)した後、#pragma warning(default:4306)で戻しておくと良いでしょう。
    #pragma warning(push)/#pragma warning(pop)でも良いですね。
    • 回答としてマーク seed-ceed 2011年5月13日 8:04
    2011年5月10日 12:25

すべての返信

  • Win7Pro(x64) + VS2008sp1 の環境

    Win32プロジェクトで新規作成、
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    を追加
    構成マネージャから、x64を追加し、x64にてビルドしても、その警告はでなかったです

    UNICODEの使用の有無や、デバッグ/リリースなども変えてみて試してみてもでませんでした

    現象を再現できる、最小の構成は、提示できますでしょうか?

    2011年4月26日 3:17
  • 返信ありがとうございます。

    こちらからの返信が遅れて申し訳ございません。

    Win32コンソールアプリケーション、スタティックライブラリを新規作成して試したところ、

    プロジェクトのプロパティ⇒構成プロパティ⇒C/C++⇒詳細

    のところの、コンパイル言語の選択で「Cコードとしてコンパイル(/TC)」を選択すると、現象が再現しました。

    ソースは、

    stdafx.cpp

    --------------------------------------------------------------------------------

    #include "stdafx.h"

    void sendMSG(void)

    {

        SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    }

    --------------------------------------------------------------------------------

     

    stdafx.h

    --------------------------------------------------------------------------------

    #pragma once

    #include "tragetver.h"

    #include "windows.h"

    #define WIN32_LEAN_AND_MEAN

    --------------------------------------------------------------------------------

    以上

     

    実際のプロジェクトは.cファイルで、「Cコードとしてコンパイル(/TC)」となっております。 

    後だし情報ですいません。。。

    よろしくお願いいたします。

     

     

    2011年5月9日 5:20
  • すいません。もうひとつ抜けているところがありました。

    プロジェクトのプロパティ⇒構成プロパティ⇒C/C++

    警告レベルがレベル4(/W4)になっていました。

    2011年5月9日 7:08
  • 再現できました。
    (HANDLE)(0xffff);
    と入れるだけでもでますね

    なぜこの条件ででるのかはわからないです。
    警告レベルを変えるか、

    #pragma warning(disalbe:4306)

    で回避するするぐらいしかないかもしれません

     

    • 回答としてマーク seed-ceed 2011年5月13日 8:03
    2011年5月10日 11:08
  • #define HWND_BROADCAST  ((HWND)0xffff)
    と定義されていますが64bitでは以下のような定義になっていないと、このWarninigが出るようです。
    #define HWND_BROADCAST  ((HWND)0xffffULL)
    原因は分かりません。
    対処方法はすでにご提案の方法を使うか、C++でCompileすることぐらいでしょうか。
    自分でHWND_BROADCASTを定義しなおしても良いですが、今後変更があったら困りますね。
     
    また、#pragma warning(disalbe:4306)した後、#pragma warning(default:4306)で戻しておくと良いでしょう。
    #pragma warning(push)/#pragma warning(pop)でも良いですね。
    • 回答としてマーク seed-ceed 2011年5月13日 8:04
    2011年5月10日 12:25
  • 返信ありがとうございます。

    64bit化というのはなかなか難しいですね。。。

    アプリ側で警告を一時的に無効にするようにしたいと思います。

    ご教授いただき、ありがとうございました。

    2011年5月13日 8:09