NoWestさん、ありがとうございます。
引用:
ようするに、OSさんがプログラマに
「こんなメッセージが送られてきたんですけど、このウィンドウはどんなふうに動くんですか?」
と、コールバック関数を介して、聞きに来ているんですね。
すいません。こっちの説明は分かったんですが、
引用:
下はファイル名を列挙するサンプルです。
でよく分からなくなりました。
普通に関数を呼んでいるだけじゃないかと。
ん~、もしかして「コールバック関数」とは、
引用:
適切なウィンドウにメッセージが送信されます。
のように、送り先を選択できる関数ってことですか?
たとえば、サンプルであれば
While lpfnCallback(w32fd)=0
で呼び出される関数は、Function EnumFile() の引数次第で変更できますよね。
でもこの機能は、コールバック関数ゆえの機能というより
関数ポインタゆえの機能な気がしますが・・・(^^;)
それとも、関数ポインタを通して呼ばれるものを
「コールバック関数」と呼ぶのでしょうか?
でも、だとするとCreateThread()で呼ばれるサブスレッドも
コールバック関数になってしまいますね。
でもあれはコールバック関数ではないらしい・・・。うーん難しい(@_@)
引用:
開発環境が違ってくると仮想関数も違ってきます。
なるほど。
「仮想関数」が指すものは、開発環境次第なのですね。
引用:
基本的にはそうです
SetProp関数だったかなんかで、クラスのメソッドにコールバック関数を含めることが出来たような気がします。
追記2005/12/22/23:10ごろ
SetProp関数が使えるのはウィンドウプロシージャだけのようです。
でも、グローバルアトムとか使ってデータの共有化を行えばVatPtr(This)ポインタとかをコールバック関数に引き渡すことが出来そうです。
調べていただいてありがとうございます。・・・が、そっちは知ってました(^^;)
「コールバック関数を持てない」と書いたのは、直には持てない、という意味でした。
誤解を招く発言でしたね。失礼^^;
グローバルアトムを使うほかにも、
引用:
コールバック関数の中には、引数の中に「アプリケーション定義の変数を渡す void ポインタ」のパラメータがあるものがあります。このようなコールバック関数の場合は、そのパラメータにクラスのポインタを渡してやり、コールバック関数内でそのクラスの型にキャストして、メンバ変数や関数にアクセスすることでこの問題を解決できます。
といった方法があるみたいですね。
肝心のウィンドウプロシージャの場合は、SetProp関数を使うのが
一般的(MFCのCWndクラスもそれ?)みたいですが、
SetProp()はアトム(=文字列)を使っているため若干重いらしく、
それを嫌う人は
「ウィンドウに関連付けられたアプリケーション定義の 32 ビット値」
を利用してstaticメソッド→目的のメソッド、と呼び出すことで、
コールバック関数をクラスのメソッドに含めているみたいです。
(蛇足へ続く^^;)
参考http://techtips.belution.com/ja/vc/0009/
http://forums.belution.com/ja/vc/000/047/79s.shtml
引用:
WINAPIというのは関数がstdcall形式で定義されていることを表しています。
あ、そっちでしたか。
なんのための識別子なのか、ひとつスッキリしました♪
引用:
Quote:
> 5) 現在、ABにはstatic識別子はない。
そうです。ぜひ欲しいですよね。
えぇ。ぜひ欲しいですねw
以下、いつものように蛇足です(笑)。
SetProp()を使わずに、クラスのメソッドに
ウィンドウプロシージャを含める方法です。
***
CreateWindow()の第11引数(~Ex()なら第12引数)のlpParm As VoidPtrに
VatPtr(This)を渡す、つまり窓に関連付けられた32bit値として
呼び出しもとのクラスのポインタを保持して、
staticなメソッドで受けた後にGetWindowLong( hWnd, GWL_USERDATA )
で取り出してstaticでないメソッドを呼び出します。
***
もちろん、GWL_USERDATAを後で使えないのが欠点。
しかし、窓をクラス化してしまったのなら、使う場面は無いように
思うので、たぶん不具合はないかと(へヴィーなものを書く人は別^^;)。
C++ですが、サンプルは・・・と最初は載せたのですが、
あくまでも「蛇足」の話題ですし、ABのフォーラムなので止めておきます^^;。
削除しました(12月23日の2時ごろ)