鏑矢の憂鬱2000年9月後半
透明1ドットイメージ
 
2000/09/16 (Sat)
・今日はお便り紹介。
 
透明1ドットイメージ
透明1ドットイメージ
 SDKに関する質問です。
 プロセスを作成し、その中でスレッドを作成したのですが、スレッド内で独自DLLを呼び出そうとしたときに、「アドレス共有違反」のエラーが出てしまいDLL内の関数の呼び出しを行うことができません。(下記のDLL2を呼び出したときです)
 
 ワークスペース内の設定がいけないと思うのですが何かわかることがあったら教えてください。各ワークスペースの設定を記述します。
 
DLL1
CPU・・・ブレンド
使用するランタイムライブラリ・・・シングルスレッド(デバッグ)
呼び出し規約・・・_stdcall
構造体のアライメント・・・8バイト
 
DLL2
CPU・・・ブレンド
使用するランタイムライブラリ・・・マルチスレッド
呼び出し規約・・・_cdecl
構造体のアライメント・・・8バイト
 
プロセス
CPU・・・ブレンド
使用するランタイムライブラリ・・・シングルスレッド
呼び出し規約・・・_stdcall
構造体のアライメント・・・8バイト
 
 何かわかることがありましたら、教えてください。
 宜しくお願い致します。
透明1ドットイメージ
透明1ドットイメージ
 
・こんばんわ〜。さて、基本的に、各設定は全部同じにするのが一番だと思います。この設定(【プロジェクトの設定】ダイアログの【C/C++】−【コード生成】ページ)は、マシン語に変換するときの設定なんで、マシン語レベルでの違いが生まれちゃうんです。基本的には全部DLL2の設定にして、「デバッグ」と「リリース」との両方を3つすべてに用意して丸ごと切り替えるようにする、っていう方法がいいと思います。
 
・あ、もしかして、こーやってそれぞれ変えてるってことには何か理由があるってことなのかな。それだと、単純に統一すればいいって問題でもないか。うーん、どうしよう。あと、「スレッドを作成」ってことはマルチスレッドってことだと思うんで、「プロセス」のランタイムは「マルチスレッド」にした方がいいと思います。ま、実際、わざわざシングルスレッドの設定にする必要はないんで。
 
・あとはまぁ、こういう設定とは関係ない部分の問題ってことも多いです。DLLまわりはデバッグが大変だから、どこに原因があるのか分かりにくいことが多くて。あ、DLL2やプロセスExeがデバッグモードじゃないから、どこに問題があるのか分からないのかな。デバッグモードにしてその辺のチェックを念入りにした方が、色々模索するよりも近道だと思うです。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/17 (Sun)
・今日はお休み〜。
透明1ドットイメージ
 
2000/09/18 (Mon)
・眠いねぇ。っと、こっちは言わない約束ね(?)。今日はお便り紹介。
 
透明1ドットイメージ
透明1ドットイメージ
 はじめまして、iostreamのメルマガ購読させてもらってます。
 gccでのコンパイルは-lstdc++を付けると良いとのことですが、そういったオプションは何処で調べるのでしょう?
 -lmで数学関数のライブラリらしいのですが、何処にのってるのやら、、、
 オプションなしでもコンパイルは通ってしまいますけどね、、、
 よろしくお願いします。
透明1ドットイメージ
透明1ドットイメージ
 
・初めまして〜。オプションはどうなんだろう、たいがいの人は gcc の本があるんでそれを読んで調べてるんじゃないかな。まぁ、基本的に gnu 系だからどっかにドキュメントあるんだろうけど、英語だと思うし、検索するといっぱい引っかかりすぎちゃうし、やっぱ本で調べるのが一番かなー。といいつつわては持ってない(爆)。それこそ -lstdc++ と -lm があればたいがい通っちゃうんで。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/19 (Tue)
・今日はCマガを購入。でもあんま読んでない(汗)。Cマガよりも、もう休刊しちゃったインサイドウィンドウズの方がずっと読み返すこと多いんだよねー。 Cマガはプラットフォームが限定されてないから、話が概念的すぎて使いずらいっつーか。たぶんこーゆー雑誌って、個人購入よりも企業顧客の方が大きいから、幅広い方が売りやすいのかもなー。
 
・そういえば、夏休み中に FFT についての解説を書くとか言って、結局書かなかったね。今年の夏休みは色々あったからなー。構想はあるのに時間がない……。 STL & iostream 入門も一応Codian化するつもりなんだけど、時間がどうか。ま、文章はすでにあるんだからその点では楽なんだけどね。10月からも時間的には結構余裕あるし。さてどうするか。
 
・あ、あとプログラミング辞書の単語送信数、激減なんですけど……。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/20 (Wed)
・今日はお休み。
透明1ドットイメージ
 
2000/09/21 (Thu)
・今日もお休み〜。
透明1ドットイメージ
 
2000/09/22 (Fri)
・今日もお休み。だって最近、全然質問送られてこないんだもの<質問がないとお休みってのが問題(汗)。
透明1ドットイメージ
 
2000/09/23 (Sat)
・ねだったら、質問がふたつ来ました(爆)。とゆーわけでまずひとつめ。
 
透明1ドットイメージ
透明1ドットイメージ
 はじめまして、MFCに関する質問です
 ファイルを開くダイアログからビットマップを選択して表示させたいのですが、ディスプレイの画像数256色の時にフルカラーのビットマップを表示させようとすると綺麗に表示はするが、表示するときにゆっくりと上部分から降りてくるようにゆっくりと表示されます。出きれば一気にすべてのビットマップがパッと出てくる形にしたいのですが可能でしょうか?ちなみにこの現象はNT4.0の時に出てくるのですがやはりOSに問題があるのでしょうか?ちなに自分が気になる点を2点あげておきます
 
(1)LoadImage()でビットマップのハンドルを取得している。LoadImage()はNT4.0をサポートしていないと知り合いから聞いたのですが関係ありますか?
 
(2)256色よりも色数が多いビットマップはCBitmap::CreateHalftonePalette()でパレットを作成している。これ以外にフルカラービットマップの時のパレットの作成方法はありますか?256色以下のビットマップをCreatePalette()でパレットを作成しているので問題ない。
透明1ドットイメージ
透明1ドットイメージ
 
・初めまして〜。えーっと、まず(1)だけど、これは聞いたことないな〜。もしそうなら KNOWLEDGE BASE とかに載ってそうだけど見つからないし。(2)はちょっと分かんないです。じつはビットマップ関係ってよく知らないんで……。
 
・で、問題の件だけど、メモリデバイスコンテキストを作って BitBlt() するっていう方法はどうかな。デバイスコンテキストに直接貼り付けるときに重くなるんだとしたら、この方法で解決するんじゃないかな。コーディング方法とかはCodianのオーナードローメニューの作製(後編)とかを参考にしてください。
 
・もうひとつのお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 質問が無くてひまそうなかぶらやさんへ質問です (^^;)
 
 当方Win2000上でVC6.0SP4という環境です。
 Codian内にあるローカルフックのページをみてちょっと組んでみたのですが全く動きません。
 デバッグしてみると、Set()メンバ関数内のSetWindowsHookEx()APIが失敗してる模様です。
 この辺に関する情報をお持ちでないでしょうか?
 MSDN7月版で検索かけてみましたが、有用な情報が得られませんでした。
 よろしくですm(__)m
透明1ドットイメージ
透明1ドットイメージ
 
・送ってくれてありがとう! で、 SetWindowsHookEx() が失敗する場合には、確か第4引数を指定したりするとうまくいく場合があったよーな。 MFC を使用してる場合には、第4引数に AfxGetApp()->m_nThreadID を渡したりするとうまくいくよーな気が。 NT 系のローカルフックはこうじゃなきゃダメ、みたいな記憶が……。とりあえず試してみてください。ってゆーか SetWindowsHookEx() って他に失敗する可能性低いからなー。あ、 GetLastError() で何か返ってくるかも……。
 
・うーん、なんかこっちでねだっといて、どっちも煮え切らない回答しちゃってますね(泣)。ごめんなさいです〜。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/24 (Sun)
・なんかむっちゃ初心者っぽい質問だけど、よく言われてる fscanf() の問題点ってなんなんでしょ。誰か具体的にばしっと教えて! 思い付くことはあるんだけどどれもいまいち説得力なくて。普段ランタイム使わないとこーゆーの辛いなー。いやね、ぷらとわで書くんで。それに会社入ったら iostream そんなに使えなさそうな気がするし。とゆーわけでよろしく〜!
 
・今日のお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 ども、ローカルフックで質問したものです。
 GetLastError()を挿入して動かしてみたところ、
 
[モジュールハンドルなしで非ローカルフックを設定することは出来ません。]
 
 とのエラー情報を得られました。そこで、いただいた回答をたよりに(というかいわれるままに)AfxGetApp()->m_nThreadIDをSetWindowsHookEx()APIの第4引数に指定してやるとうまくいきました(^-^)
 っていうか、よくみると SetWindowsHookEx()の解説に遠まわしに書いてありました。お恥ずかしい(^^ゞ
 久しぶりに Windows 上でプログラム組みたくなった矢先に行き詰まっちゃって、w思わず「やーめたやめた病」が始まるところでした(^^ゞ
 
 というわけで、適切な回答ありがとうございましたm(__)m
透明1ドットイメージ
透明1ドットイメージ
 
・解決したみたいで良かったです。ってゆーか、わても知ってたんだからCodianに書いとけば良かったんですね(汗)。今日の更新で書き加えておきますんで。これからも質問よろしくね〜。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/25 (Mon)
・あう、結局 fscanf() のこと誰も送ってくんなかった(泣)。だからお休み(爆)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/26 (Tue)
・今日はお便りがふたつ。ではまずひとつめのお便り!
 
透明1ドットイメージ
透明1ドットイメージ
 fscanf()ことではないです、すいません。
 MFC DLL(レギュラー)の作成について教えて下さい。(拡張でもいいです)
 
 やりたいのは、DLL側でモードレスウインドウを生成&メッセージ処理なんですが、現時点では、MSDNのヘルプ通りに
 
EXE(PreTranslateMessage)

ルーチン(DLL によりエクスポートされたもの)

DLLのCWinApp::PreTranslateMessage
 
 の処理を追加しましたが、怒られます。(ESPがどうのこうのって感じで。。。)
 
 で作っていて思ったのですが、DLL側ではまだウインドウを生成されていない状態なのにEXEのメッセージ ポンプからDLLのメッセージ ポンプを呼び出してもよいのでしょうか?
 
 また、どのタイミングでDLL側で独自のメインフレーム ウィンドウを生成すればよろしいのでしょうか?
 あと、EXE側が親ウインドウになるのでウインドウの登録方法も教えてくらはい。
 
 よろしくお願いします。
透明1ドットイメージ
透明1ドットイメージ
 
・お便りありがとう! こちらとしては fscan() のことより休みになる方がイヤ〜ンなんで(爆)。これは「テクニカル ノート 11」に書いてあるのかな。はっきし言ってこのページに書いてある解説わかんない(爆)。 DLLTRACE 見れば分かると思ったらよく分かんないし。 MFC は複雑だし。むー。
 
・基本的に、メッセージポンプはスレッドに1個なんで、スレッドが1個だけなら DLL をいくらリンクしてもメッセージポンプは1個だけ。だから CWinApp::PreTranslateMessage() を呼び出しても DLL のメッセージポンプに投げられる、ってことはありえないんです。テクニカルノートに書いてあるのってちょっと違うことなのかもしんない。
 
・気になるのが ESP ってエラー。これって「不正な処理」とか書かれてるダイアログの「詳細」で出てくるのだよね。 MFC まわりのエラーの場合、普通 ASSERT() のエラーで出てくる Microsoft Visual C++ Debug Library ってダイアログが出ると思うんで、そうじゃないってことは MFC とは無関係の所でエラーが出てるのかもしれない。このエラーがどこで出てくるのかチェックできれば。
 
・ DLL 側ウィンドウの作成タイミングはいつでも大丈夫でしょう。エクスポートされた DLL 側の関数から普通に作成すれば大丈夫かな。それとも MFC 使ってるからそういうふうに自由にできないのかな。 Exe 側のウィンドウの登録ってのは、子ウィンドウに対する親ウィンドウとしての登録方法ってことかな。それは CWnd::Create() とかの引数に親ウィンドウを指定する部分があるから。
 
・ふと思ったんだけど、「ウィンドウの作成タイミング」ってことは、もしかして Exe 側のウィンドウができる前に DLL 側のウィンドウを作成しようとしてるのかな。それだとちょっとまずいかもしんない。親の CWinApp 派生クラスの m_pMainWnd が NULL のままだと動かないと思うから。そういう場合には、まずウィンドウを作っちゃって ShowWindow() で SW_HIDE とかして非表示ウィンドウ化しちゃった方が処理が楽かもしんない。むー、なんかやっぱ MFC って複雑っすね〜。
 
・ふたつめのお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 またおじゃまします。先日質問した八木田です。
 
> あう、結局 fscanf() のこと誰も送ってくんなかった(泣)。だからお休み(爆)。
 とのことで、休んで欲しくないので(笑)つっこみです。
 
 fscanf() はセキュリティ的に問題があるんです。
 最近のセキュリティホールの多くはバッファオーバーフローっていうのに起因していて、この関数はバッファオーバーフローを起こす関数のひとつなんです。
 僕の知るかぎり、NULLターミネートされていることを期待している関数はこのような現象を起こす可能性を含んでいます。
 で、なぜバッファオーバーフローがキケンかというと、普通ならば取得できるはずの無いスタックポインタを取得して、実行できるはずの無いコードを実行できてしまうからなんですね。
 ようするにそのスタックポインタをその"実行できるはずの無いコード"へあわせると...怖いですね〜。
 
 とここまで書いたのはいいのですが、あんまり自信が無い(^^ゞのでポインタをしめしますね。
Shadow Penguin Plagin
linux JF Documentation - Secure-Programs-HOWTO
 
9/24のかぶゆ〜より...
> それに会社入ったら iostream そんなに使えなさそうな気がするし
iostream とか C++ はあんまり現場のシステム開発とかじゃ使う機会がないと思いますよ。
 すくなくとも僕は、今日はじめてプログラマになってから C++ と MFC のソースを見ました。
 まー僕の場合、最近まで組み込み系(マイコンってやつです)でハードをバリバリいじってたってのもあるんですが。
透明1ドットイメージ
透明1ドットイメージ
 
・お便りどうもですー! これは IE なんかであったセキュリティの問題ですね。でも実はこれについて訊いてたわけじゃなかったり(汗)。「 fscanf() は fgets() と sscanf() で代用すべし」ってのが結構言われてるんだけどその根拠が曖昧だったんでそれが知りたかったとゆー。んでもスタックオーバーフローって実はよく知らなかったんで実はかなり役立ったり(爆)。
 
・やっぱ C++ 使ってるとこって少ないですよねー。わての知り合いとかの会社はどこも使ってないです。内定先はパッケージも作ってるんで、そっち回してくれるとうれしいんだけどね。でも組み込み系は家じゃ絶対できないことだから結構そっちも楽しみだったり(爆)。10月2日の内定式ですこーし分かると思います。さてどうなるか。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/27 (Wed)
・毎日お便り送ってくれてありがとねん。では今日のお便り!
 
透明1ドットイメージ
透明1ドットイメージ
 DLLの件ありがとうございました。
 ちょっと気になったのが、”基本的に、メッセージポンプはスレッドに1個なんで、スレッド・・・・・”とのことですが、独自のモードレスウインドウをDLL側で制御、生成されるのでメッセージポンプは結局EXEとDLL側で2つになるのではないでしょうか?
 ヘルプの『MFC と動的にリンクされるレギュラー DLL』で一度検索してみてください。
 ESPのエラーはその通りのダイアログです、ちょっと追ってみます、ありがとうございました。(このケース(DLL側でのモードレスウインドウ制御)の場合あまりどこのサイトでも取り上げられていないみたいなので、一度作成して見て下さい。っていうかそれを参考にします)
 
 で。。。本題ですが、うぅぅぅぅぅこれは聞かんといかんと思ってたことを忘れてしまいました、また思いだしたら
 お願いします。
透明1ドットイメージ
透明1ドットイメージ
 
・えーっと、メッセージポンプっていうのは GetMessage() を使ってメッセージをメッセージキューから取り出して DispatchMessage() で各ウィンドウプロシージャにメッセージを送る部分のことです(Codianのウィンドウプロシージャの呼びだしと MSDN の「め」の「メッセージ ポンプ」の項目を見てください)。
 
・ MFC の場合、 CWinApp::Run() (正確には CWinThread::PumpMessage() )にこのコードが書かれてます。『MFC と動的にリンクされるレギュラー DLL』を見ると、 Exe と DLL 含めてひとつの CWinApp::Run() が実行されるような仕組みになっているみたいです。これがつまり、スレッドひとつにメッセージポンプひとつ、をコードとして実現してるわけです(内部システム的にメッセージキューはスレッドにひとつだから)。
 
・「 DLL 側でモードレス ダイアログを……」ってくだりは、「メッセージポンプは Exe 側にしかないから以下のようにしないと問題が発生する」ってことみたいです。 CWinThread::PreTranslateMessage() の中身を見ると「モードレスダイアログのアクセラレーターテーブルの処理」を呼び出す部分があって、この関数を呼び出さないと DLL 側のモードレスダイアログのアクセラレーターテーブルが効かなくなるよ、ってことみたいです。 CWinThread::PreTranslateMessage() はメッセージポンプの前に呼び出す前処理用関数なんで、そういう機能が備わっているんでしょう。
 
・……ってゆーか、 MFC って複雑(汗)。わてとしては、拡張 DLL にしちゃった方が100倍楽だと思うです(爆)。 CWinApp が DLL の中にあるってこと自体が複雑なのの原因のような気がするなー。拡張 DLL にすれば、 Exe と DLL の違いが全然ない形でプログラムできると思うです。拡張 DLL にして、普通に CDialog::Create() 呼び出して作るって形なら、かなり楽にできると思うです。支障なかったら拡張 DLL にしちゃいましょう。
 
・あ、でも、 DLL でダイアログ作る理由次第ではそうもいかないかなぁ……。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/28 (Thu)
・今日もお便り〜。
 
透明1ドットイメージ
透明1ドットイメージ
 お久しぶりです
 DLLを使った簡易解凍ソフトを作っておりますが、拡張子による分岐処理でifを抜けたあとでエラーが出ます
 デバッガはESPが云々と言っていましたが(爆)・・・さっぱり分かりません。手がかりだけでも教えて下さると幸いです。
 (ソースが必要なら遠慮なく言って下さいm(_ _)m)
透明1ドットイメージ
透明1ドットイメージ
 
・おひさです〜。やっぱソースコードないと分かんないかも(爆)。あとエラー。この前の方も ESP がなんたらって言ってたけど、これって「不正な処理」ダイアログの「詳細」で出てくるのでいいのかな。実はどーゆーエラーが出てくるかでだいたい分かるんで。でも「だいたい」だけど(汗)。
 
・実際、「不正な処理」ダイアログの「詳細」欄は、単にレジスタの中身を表示してるだけなんで、まず役立たないと思うです。エラーを見つける場合には、デバッグモードで ASSERT() ばらまいて、ステップインしつつ変数の中身を見てくってとこかな。まーそれで見つかりゃ苦労しないんだけどさ(汗)。とゆーわけでそれはたぶんコード見た方が早いと思うですー。
 
・ついさっき(ただいま午後11時)送られて来たのは明日ね〜。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/29 (Fri)
・今日もお便り紹介。
 
透明1ドットイメージ
透明1ドットイメージ
 DLL側で作りたい理由は今までWinMainと同じ階層にあったモードレスウインドウをモジュール化し独立化し流用したいと思ったのです。
 
 拡張 DLL を使えば簡単に出来るのですか? 一度やってみます。
 
 今日の質問ですが、ちょっと困ったことがあります。
 フレームウインドウ(POPUPスタイル)に直接BMPを張ってウインドウを動かすとウインドウが画面の外にでるとBMPの位置がフレームウインドウとずれてしまいます、
 原因はフレームウインドウのOnPaintのBMPを描画処理でBitBltするとこでフレームウインドウ位置が外の場合におかしくなります。
 ようは、フレームウインドウが外にはみ出している場合にどうやってBitBltの第2、3の引数に値を入れたらよいのでしょうか、何かいい作戦ありませんか?
透明1ドットイメージ
透明1ドットイメージ
 
・ソースコードの方読んだけど、 SDK の時の「親ウィンドウの上に子ウィンドウ」と同じ形式を MFC でもやった方が楽だと思います。もともと MFC の SDI アプリは「 CFrameWnd 派生クラスの上に CView 派生クラス」って形になってるんで、普通に MFC の SDI アプリ作ってフレームウィンドウのタイトルとか取っ払ってビューと同じサイズにしてビューにビットマップ貼り付ける、って形がいいと思いますです。
 
・ SDI アプリの作り方は、 MFC App Wizard (exe) を選んで次のダイアログで SDI を選べばOK。こうして CView 派生クラスの OnPaint() で件のコードを書けばうまくいくんじゃないかなー。ソースコードだとかなり無理してビュークラスを作ってるんでその辺でうまくいかないっぽいです。
 
・ってゆーかデスクトップに直接描画は危険すぎ(爆)。だからずれちゃってるんだと思うです。クリッピングとかもデスクトップウィンドウを基準にされるから、あんなふうに無茶苦茶な描画になっちゃってるんでしょう。ただ、こっちで CDisplay に描画する形に書き換えてテストしてみたんだけど、ウィンドウをはみ出させるとその部分が描画されなくなっちゃいました(汗)。なんでだろう。 MFC SDI アプリの形式にして OnPaint() で実行するようにしたらうまくいくことを祈ろう。
 
・ DLL の目的がモジュール化なら、迷わず拡張 DLL にしましょう。レギュラー DLL の場合、 MFC 関係がその DLL に詰め込まれちゃうんでおもいっきしファイルサイズが大きくなります。なんでいっぱい作るとかなり大変。拡張 DLL なら、ホントに外に出したいものだけを DLL に入れることができるんで使いやすいと思います。ただし、別に MFC42.dll とか必要になるけど(汗)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/09/30 (Sat)
・今日はお便りをふたつ。まずはメールでサンプル送ってくれた方へ〜。
 
    char temp[] = "x ";
    char* Cmd_b = strcat( temp, Cmd_a);
	
 
・これがたぶん元凶でしょう。 strcat() は「第1引数の最後に第2引数を書き込む」とゆー仕様なんで、おもいっきし配列をはみ出ちゃいます。 char temp[_MAX_PATH] とかして strcpy( temp, "X " ) してあとはそのままって形がえーかな。でもこまめにオーバーフローのチェックはしましょー。それにしてもこの手のエラーが流行ってるよーな(汗)。
 
・普通の配列だと、オーバーフローのチェックが難しいんだよね。 VC のデバッグ版 new & delete だとその辺ばっちしチェックしてくれるからいいんだけど、そんなん使うくらいの人ならたいがいオーバーフローチェックは欠かさないですな(爆)。それに使うの面倒だし。 std::string 用アロケーターでこの機能付いてるの作るかなー。
 
・もひとつお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは、疑問があるのですが、MFCのウインドウの登録で、AfxRegisterClassを使う場合ですが、ウインドウプロシージャの登録の個所がありますが、MainFramはAfxWndProcでいいとして、その子供のウインドウの場合はAfxWndProcでいいのでしょうか? ウインドウハンドルが違うからいいのでしょうか?
 AfxWndProcの内部でちゃんと振り分けてくれてるの???
 
#ず〜とSDKでやってたからなんか気持ち悪いっす。
透明1ドットイメージ
透明1ドットイメージ
 
・わては MFC から SDK 中心になったんだけど、それでもやっぱ気持ち悪い(爆)。 MFC はあかんね。えっと、結論から言うと大当たり、 AfxWndProc() の内部で振り分けてくれてるんで問題ないです。ウィンドウハンドルから CWnd::FromHandlePermanent() で CWnd ポインタを探し出してメッセージを送る仕組みになってます。その辺のことはCodianの「MFCユーザーのためのAPIプログラミング講座」に書いてたりするんでそちらもご覧あれ。
 
・でわまたっ!
 
 
(C)KAB-studio 2000 ALL RIGHTS RESERVED.