型思想
abdev 8月 13th, 2005キャストの問題を処理していて、フッと思ったことなのですが、Win32APIが用意してくれる型って、ちょっと悪趣味だと思いません?だって、よく考えてみてくださいよ。
typedef int INT; typedef long LONG;
とかしてるんですよ。APIの上では、型を大文字で統一しましょうみたいな流れがあったと風の噂で聞いたことはありますが、それが徹底されていない現状を見ると、どうしても気持ち悪いんです。
ABはWin32APIの影響をモロに受けるような言語仕様、ライブラリ構成になってるんですが、これらVCで不徹底されている型環境というお荷物まで背負い込むことはしたくないんですよね。
ABはVer4.1から厳しい型チェックを行える”#strict”ディレクティブを導入するので、LongとDWordを曖昧に使い分けたりはできないんです。気持ち悪い型の例をもう一つくらい示しておきましょうか。
typedef long LONG; typedef unsigned int UINT; typedef UINT WPARAM; typedef LONG LPARAM; LRESULT CALLBACK WindowProc( HWND hwnd,// ウィンドウのハンドル UINT uMsg,// メッセージ WPARAM wParam,// メッセージの追加情報1 LPARAM lParam// メッセージの追加情報2 );
WPARAMとLPARAMって、正直新しい型を導入してまで定義する必要、あるんでしょうか。wParamもlParamも所詮はメッセージの追加情報。どうあがいても32ビット整数値なんです。しかも、符号あり/なしに分別されている意味がわかりません。2つともDWORD(もしくはUINT)に統一させればいいじゃないですか。
初心者向けにWin32APIを解説しているページを見かけると、WPARAMとLPARAMについてのコラム的な解説が目立ちます。結局はlongとかunsigned intとかなんですぅ〜、という具合にまとめられているのですが、だったら最初からlongとかunsigned intとかで定義してくれよぅ。WPARAMとLPARAMという新たな型を作り出す必要、符号あり/なしを分ける必要がどこにあるんだよーぅ。
と、まるでタダをこねるような本日の思想ですが、、、ABライブラリではどうしようか悩んでしまいます。Win32APIとの互換性を重要視するんであれば、またはネット上にある様々な情報を取り入れやすいようにするんであれば、WPARAMやLPARAMを始めとする奇妙な型を導入すべきなんだと思います。でもでも、おいら的に納得がいかないんですよね〜。
といいながら、Ver4.1でWPARAMとLPARAMを導入してしまいそうな、意思の弱さときたら…(トホホ)。まぁ、64ビット環境のライブラリなどの環境変化を考慮すると、型指定にワンクッション余裕を持たせるのは必要ではあるんですけどね…。ABユーザーの皆さん、AB環境に影響を及ぼしかねないWin32APIの型について、どう思います???
8月 14th, 2005 at 17時28分24秒
型の問題は私もC++のヘッダファイルをAB用に移植していて感じています。私の作った定義ファイルではLONG、INT、int、longなどの同じことが分かりきった型についてはAB標準のLong型を使い。ATOMやLCIDやLRESULT、WPARAMなどの特殊な名前が付いている型はCの定義をそのまま参照しています。とにかくソースの可読性が最重要なので、特殊な名前が付いている型は導入した方が良いのではないかと思います。まぁ、好みの問題だと言えばそれまでですが、、、
8月 15th, 2005 at 22時03分25秒
特殊な意味を持つ型、ですよねぇ〜。様々な資料との互換性を考えると、あからさまに冗長的な表現でない限り、取り入れたほうがよさそうですね。Win64では、キレイになっていることを期待します。そういえば、DWord32・DWord64が気に入らなくて、ABはDWord・QWordでいくことを決めたばかりでした。行く先不安です(><)
8月 27th, 2005 at 22時58分38秒
Win16ではWPARAM:16ビット LAPARAM:32ビット LRESULT:32ビットで、しかも当初はLONG CALLBACK WindowProc(HWND hwnd, UINT uMsg, WORD wParam, LONG lParam);と書いてOKだったようです。(WPARAM, LPARAM, LRESULTは存在しなかった模様)Win32でintとポインタが32ビットになることで、そこへの移行のため(だとおそらく思われます)、後からWPARAM, LPARAM, LRESULTが出現しましたようです。で、Win32/64は周知のとおり、全て32/64ビットですね。元々16ビットだったWPARAMは64ビットになるという大躍進を遂げました(笑)ところで現在の32ビットVCのWPARAM, LPARAM, LRESULTは64ビット対応警告に対応するため、typedef時に__w64キーワードを付加しています。 ところでなぜ符号なしWORDと符号ありLONGの組み合わせなのかは私も疑問です。私がWin16APIを作っていたらWORDとDWORDにしたでしょう。(あるいはintとlong)WORD/LONGの組み合わせはほかにもGetWindowWord/GetWindowLongなど至る所にあります。こんなことをしているからWin64はLONGを64ビットに出来ず、LONG64やらDWORD64やらを作る羽目に……。VB.Netは過去のしがらみを捨てLongを64ビットにしましたがWinAPIはそうもいかないようで……。DWord32・DWord64が気に入らないのは私も同感です。Wordが16ビットである以上DWordは32ビット以外はありえないと。