「
リストビューのソートの方法」のスレッドからの続きです。
かなり話をそらしてしまったので、別スレッドにします。
≫イグトランスさん
レスが遅れてしまい、すいません。
混乱気味なので、かなり端折った理解をしようとおもいます^^;
つまり、クラスだろうが仮想関数だろうがアドレス自体は常に存在する。
コールバック関数として指定するときに問題になるのは、
コンパイル時点で呼び出すべきアドレスが決定しているかいないか。
クラスメソッドの場合は、継承にともなうオーバーライドなど(?)のために、
呼び出すまでアドレスが(普通の方法では)分からないので、
static以外ではコールバック関数としては指定できない、というこですね。
まぁその実は引数の数の問題
(オブジェクトへのポインタは、なるほどと思いました)とかが
理由なのでしょうけど、簡単のために、上記のように、そしてコンパイラのエラー文に出た
「アドレスが見つからない」故だと理解しておきます^^;
COMオブジェクトはさっぱりわかりませんのでスルー(汗)。
イグトランスさん さんが書きました:いや,CreateThreadの場合も形としてはコールバック関数です。
ただスレッドを作るという機能が強調されるので,
特にコールバックとは言われないことが多いだけですよ。
あ、そういう意味だったんですか。
「概念上コールバック関数とは異なるものなので注意してください」という
記述があったもので、コールバック関数じゃないと思ってました^^;
http://wisdom.sakura.ne.jp/system/winap ... in143.html
イグトランスさん さんが書きました:SetPropに文字列ではなくアトムを使った場合は,SetWindowLongを使った場合とほぼ同じ速度だという計測結果があります。
あらら。実際はそんなに問題じゃなかったんですね。
でも私にはSetWindowLongの方法のほうが分かりやすいので、
しばらくはこちらで行こうと思います。
に共感しますので(^^)
しかし、SetClassLongですか・・・そんなのもあるんですね。
今のところは「そういうのがある」とだけ覚えておきます^^;
あまり一気には使いこなせません~(汗)。
≫NoWestさんもう一度全体の流れを詳しく順に書きます。
あぁ、すいません(>_<)
その流れは分かってたんですが・・・「OSからユーザーがわに制御が
呼び戻されるのがコールバック関数。でも、ユーザーが自作すること
もできるとは・・・どういうことだ?」と疑問に思ったのでした。
つまり、渡した制御が渡した側に戻すされることがコールバック。
一般には、OSに渡した窓制御からメッセージ通知によって
処理がユーザーに戻される(ユーザーが好きに記述できる)ことを
コールバック関数と呼ぶ、ってことですね。
NoWestさん さんが書きました:Windowsのシステムの特定の処理に対して、プログラマが選択的に処理を組むことができる仕組みがコールバックです。
という説明が一番しっくりきました。
そして、窓制御に、Windowsが提供しているものに限らず、
自作の関数であっても「制御が戻される」という観点で見て、
それをコールバック関数と呼ぶものがある(そう区分される)、
ってことですね。
いつものように蛇足ですけど。
コールバック関数うんぬんのことは全部、C++で組んでて思った疑問だったのでした^^;
窓プロシージャやらサブスレッドをメソッドに持たせたりしようとして
ぶつかった問題でした。(今は解決済み)
それで、このフォーラムでリストビューのソートを調べてて、
コールバック関数がまた出てきたので、
「コールバック関数とそれ以外の区別はどこなんだ?」
と気になったので、ちょっと蛇足に書いたのですが・・・
私としてはC++で始まった疑問だったので、ABのこのフォーラムで
こんなに詳しく解説していただくと、なんか悪い気がしますね。
すいません^^;
イグトランスさん、NoWestさん、ありがとうございました。
「[url=http://www.discoversoft.net/forum/viewtopic.php?t=576]リストビューのソートの方法[/url]」のスレッドからの続きです。
かなり話をそらしてしまったので、別スレッドにします。
[b]≫イグトランスさん[/b]
レスが遅れてしまい、すいません。
混乱気味なので、かなり端折った理解をしようとおもいます^^;
つまり、クラスだろうが仮想関数だろうがアドレス自体は常に存在する。
コールバック関数として指定するときに問題になるのは、
コンパイル時点で呼び出すべきアドレスが決定しているかいないか。
クラスメソッドの場合は、継承にともなうオーバーライドなど(?)のために、
呼び出すまでアドレスが(普通の方法では)分からないので、
static以外ではコールバック関数としては指定できない、というこですね。
まぁその実は引数の数の問題[color=#777777][size=84](オブジェクトへのポインタは、なるほどと思いました)[/size][/color]とかが
理由なのでしょうけど、簡単のために、上記のように、そしてコンパイラのエラー文に出た
「アドレスが見つからない」故だと理解しておきます^^;
COMオブジェクトはさっぱりわかりませんのでスルー(汗)。
[quote="イグトランスさん"]いや,CreateThreadの場合も形としてはコールバック関数です。
ただスレッドを作るという機能が強調されるので,
特にコールバックとは言われないことが多いだけですよ。[/quote]あ、そういう意味だったんですか。
「概念上コールバック関数とは異なるものなので注意してください」という
記述があったもので、コールバック関数じゃないと思ってました^^;
http://wisdom.sakura.ne.jp/system/winapi/win32/win143.html
[quote="イグトランスさん"]SetPropに文字列ではなくアトムを使った場合は,SetWindowLongを使った場合とほぼ同じ速度だという計測結果があります。[/quote]あらら。実際はそんなに問題じゃなかったんですね。
でも私にはSetWindowLongの方法のほうが分かりやすいので、
しばらくはこちらで行こうと思います。
[quote="リンク先サイトから抜粋"]
CWindowから派生させてウィンドゥを出すなら、その派生クラスのメンバとしてデータなり何なり持たせ放題なわけで、わざわざAPI呼び出してデータを取得するとは思えんのだが
http://hilbert.elcom.nitech.ac.jp/~taki/program.html[/quote]に共感しますので(^^)
しかし、SetClassLongですか・・・そんなのもあるんですね。
今のところは「そういうのがある」とだけ覚えておきます^^;
あまり一気には使いこなせません~(汗)。
[b]≫NoWestさん[/b][quote]もう一度全体の流れを詳しく順に書きます。[/quote]あぁ、すいません(>_<)
その流れは分かってたんですが・・・「OSからユーザーがわに制御が
呼び戻されるのがコールバック関数。でも、ユーザーが自作すること
もできるとは・・・どういうことだ?」と疑問に思ったのでした。
つまり、渡した制御が渡した側に戻すされることがコールバック。
一般には、OSに渡した窓制御からメッセージ通知によって
処理がユーザーに戻される(ユーザーが好きに記述できる)ことを
コールバック関数と呼ぶ、ってことですね。
[quote="NoWestさん"]Windowsのシステムの特定の処理に対して、プログラマが選択的に処理を組むことができる仕組みがコールバックです。[/quote]という説明が一番しっくりきました。
そして、窓制御に、Windowsが提供しているものに限らず、
自作の関数であっても「制御が戻される」という観点で見て、
それをコールバック関数と呼ぶものがある(そう区分される)、
ってことですね。
いつものように蛇足ですけど。
コールバック関数うんぬんのことは全部、C++で組んでて思った疑問だったのでした^^;
窓プロシージャやらサブスレッドをメソッドに持たせたりしようとして
ぶつかった問題でした。(今は解決済み)
それで、このフォーラムでリストビューのソートを調べてて、
コールバック関数がまた出てきたので、
「コールバック関数とそれ以外の区別はどこなんだ?」
と気になったので、ちょっと蛇足に書いたのですが・・・
私としてはC++で始まった疑問だったので、ABのこのフォーラムで
こんなに詳しく解説していただくと、なんか悪い気がしますね。
すいません^^;
イグトランスさん、NoWestさん、ありがとうございました。