• ベストアンサー

猫でも 20章

LRESULTはlong型、DWORDはmsdnより、「32 ビットの符号なし整数、またはセグメント アドレスとそれに関連するオフセット」、SendMessageは返り値はLRESULT型。それで、猫でもわかるプログラミング20章(http://www.kumei.ne.jp/c_lang/sdk/sdk_20.htm)、の上のほうにリスト等の情報を取得するのに、 int getDlg(HWND hDlgWnd) { GetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT1), edit_str, sizeof(edit_str)); ScrPos = GetScrollPos(GetDlgItem(hDlgWnd, IDC_SCROLL1), SB_CTL); ListNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_LIST1), LB_GETCURSEL, 0L, 0L); ComboNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_COMBO1), CB_GETCURSEL, 0L, 0L); return 0; } とあるのですが、SendMessageを(int)(DWORD)とキャストしているのはなぜなんでしょうか。(int)ではダメですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 プログラムそのものが、コンパイラ依存に見えてしょうがあません。  intの大きさに関しては、Cの規約によれば、定義されていません。型の大きさが、short <= int <= long を満たしていれば、 後は、コンパイラーの作者がコンパイラーを作りやすいように勝手に決めて良いことになってます。(本来は、もう少し条件がありますが)  というわけで、intの変数に32ビットの符号無し整数が格納できるかどうかは、その時に使用するコンパイラー次第と言うことになります。  普通は、32ビットのCPUを使用したときには、32ビットの数値が一番使いやすいので、最近のwindows環境では、intは32ビットの符号付き整数となることが多いと思いますので、多分、そのプログラム符号のせいで少々面倒なことになるかも・・・ですね。(たとえば、ListNoの大小を比較は単純にはできません。)  せめて、(unsigned int)ならば、まだ動く確率は大きいですが・・・それでも、まだコンパイラ依存です。  この教訓は・・・windows APIとのやりとりを行う変数は、極力、SDKで定義されたtypedefを使用することです。外部とのやりとりのため、どうしようもないときだけ、DWORDだとunsigned longに変換。数値の大きさが絶対に保証できるときに限り、コンパイラ依存を覚悟でそれ以下の大きさの型にする・・・でしょうか。  intやlongの大きさが絡む問題は、注意が必要です。

arcsin
質問者

お礼

経験も浅いため、少し私には理解するのに時間がかかりそうですが、また後ほど読み返してみたいと思います。詳しく考察していただき、ありがとうございます。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

なぜでしょうね? intでキャストして問題ないはずですけど。 というか、ListNoとComboNo、本来はlongであるべきなんですけど・・・ あくまでサンプルということで、すべて鵜呑みにするのは良くないということですね。

arcsin
質問者

お礼

そうなんですか~。 少し安心しました。ありがとうございます