- 締切済み
代入したのに値が更新されないんです・・・
WindowsXP VC.netでプログラミングしているのですが、 PostMessageでコールされる関数のWPARAMを publicで宣言した変数に代入しても、 値が更新されないんです。。。 public: WPARAM m_wWP; とヘッダで定義して、 WPARAMの値が10であった時、 long testclass::PostCallFunc( WPARAM wparam, LPARAM lparam) { m_wWP = wparam; } とやってもm_wWPが10にならないんです。。。 とっても困っています。 ご存知の方がいらっしゃいましたらご教授ください。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
補足の質問に回答するのは簡単なのですが、その前に・・・No.1の回答での指摘は合っていたのでしょうか。それとも的外れだったのでしょうか。
testclass::PostCallFunc関数はlong型になっているのに、 戻り値が無いのはタイプミスですか?
補足
タイプミスじゃないです。 省略です。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
ひょっとして (1) testclassにPostMessage()する (2) PostMessage()から帰ってくる (3) testclass::m_wWPの値を見る (4) 変化していない!? という手順で変数の値を確認していませんか? この例で変数の値を確認する正しい手順は (1) m_wWP = wparam;の行にブレークポイントを置く(あるいはデバッグ用メッセージ出力を置く) (2) testclassにPostMessage()する (3) ブレークポイントに到達するのを待つ(あるいはデバッグ用メッセージが表示あれるのを待つ) (4) (ブレークの場合はブレーク行をステップ実行してから)変数の値を確認する です。 PostMessageで送ったウィンドウメッセージは、PostMessage()から帰ってきた時点ではまだ処理されていない可能性が高いので、PostMessage()から帰ってきた直後は変数の値が変化していない可能性もまた高くなります。
補足
回答ありがとうございます! お礼が遅れて申し訳ありません!! 回答の中で「PostMessageで送ったウィンドウメッセージは、PostMessage()から帰ってきた時点ではまだ処理されていない可能性が高い」とありますが、なぜなんでしょうか・・・? ウィンドウメッセージ(WM_CREATEやWM_PAINTなど)を使用しても値が更新されないような問題は発生していません。。。
補足
Windowsの仕組みから考えて、PostMessageしたあと、 メッセージプロシージャがコールされた時、 WPARAM、LPARAMの値が確定(更新?)されない場合が あるとは、考えにくいと思います。 現に、 (1)AからBにPostMessage (この度質問した例) (2)AからCにPostMessage (3)AからDにPostMessage (同様の処理を行う別のモジュール) とあった場合、 (2)と(3)はまったく問題なく処理できているのに、 (1)はできなかったのです。 また、質問した後、リビルドしたら現象が起きなくなりました。 よって、PostMessageした後、値が更新されていない可能性がある、というのは、ちょっと該当しないと思われます。