コールバック関数と、ディスパッチ ハンドラー コードの関係は? – プログラミング – Home

コールバック関数と、ディスパッチ ハン...
 
通知
すべてクリア

コールバック関数と、ディスパッチ ハンドラー コードの関係は?


かとう まさひこ
 かとう まさひこ
(@かとう まさひこ)
ゲスト
結合: 12年前
投稿: 1
Topic starter  

BOOL CUtilCtrl::SampWaveIn(long hWnd)
というコールバック関数があるとします。
ハンドラーコードからのディスパッチは
通常、どうすればいいのでしょうか?


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

...こんなんでええの?

#include <iostream>
#include <functional>

typedef bool BOOL;

class CUtilCtrl {
public:
BOOL SampWaveIn(long hWnd) {
std::cout << CUtilCtrl::SampWaveIn( << hWnd << )\n;
return true;
}
};

typedef std::function<BOOL(long)> handler;

class Kicker {
public:
void set_handle(handler h) { fun = h; }
bool kick(long arg) { return fun(arg); }
private:
handler fun;
};

int main() {
CUtilCtrl c;
Kicker k;
k.set_handle([&](long arg) -> BOOL { return c.SampWaveIn(arg); });
k.kick(123L);
}


返信引用
いえやす
 いえやす
(@いえやす)
ゲスト
結合: 15年前
投稿: 18
 

さっそくのお返事、ありがとうございます。

BOOL SampWaveIn(long hWnd) {
std::cout << CUtilCtrl::SampWaveIn( << hWnd << )\n;
return true;
}
の中に、コードの実態を入れるのですね。

今、教えていただいたコードのままで、VS2005でコンパイルをかけたら、
下記のエラーが出てしまいました。
何か、やり方が悪いのでしょうか?

1>c:\R_R_F\S_R.cpp(14) : error C2039: 'function' : 'std' のメンバではありませ
ん。
1>c:\R_R_F\S_R.cpp(14) : error C2143: 構\u25991 文エラー: ';' が'<' の前にあり
ません。
1>c:\R_R_F\S_R.cpp(14) : error C4430: 型指定子がありません- int と仮定しまし
た。メモ: C++ はint を既定値としてサポートしていません
1>c:\R_R_F\S_R.cpp(18) : error C2061: 構\u25991 文エラー: 識別子'handler'
1>c:\R_R_F\S_R.cpp(21) : error C2146: 構\u25991 文エラー: ';' が、識別子'fun'
の前に必要です。
1>c:\R_R_F\S_R.cpp(21) : error C4430: 型指定子がありません- int と仮定しまし
た。メモ: C++ はint を既定値としてサポートしていません
1>c:\R_R_F\S_R.cpp(21) : error C4430: 型指定子がありません- int と仮定しまし
た。メモ: C++ はint を既定値としてサポートしていません
1>c:\R_R_F\S_R.cpp(18) : error C2065: 'fun' : 定義されていない識別子です。
1>c:\R_R_F\S_R.cpp(18) : error C2065: 'h' : 定義されていない識別子です。
1>c:\R_R_F\S_R.cpp(19) : error C3861: 'fun': 識別子が見つかりませんでした
1>c:\R_R_F\S_R.cpp(27) : error C2143: 構\u25991 文エラー: ')' が'[' の前にあり
ません。
1>c:\R_R_F\S_R.cpp(27) : error C2059: 構\u25991 文エラー: ']'
1>c:\R_R_F\S_R.cpp(27) : error C2143: 構\u25991 文エラー: ';' が'{' の前にあり
ません。
1>c:\R_R_F\S_R.cpp(27) : error C2065: 'arg' : 定義されていない識別子です。
1>c:\R_R_F\S_R.cpp(27) : error C2059: 構\u25991 文エラー: ')'


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> 今、教えていただいたコードのままで、VS2005でコンパイルをかけたら、
> 下記のエラーが出てしまいました。

2005だから。2010,1012なら無問題。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

単に、コールバック関数と言ったら範囲は広いよ。
ランタイムライブラリの
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
とかでcompareに渡す関数もコールバック関数の一種だし。

ディスパッチ,ハンドラ-とか言ってる時点で、ウィンドウメッセージとかの
やりとりのことを言ってるのかな?
情報が足りなくて憶測しかできない。

ウィンドウメッセージからメッセージハンドラ関数を呼び出す手順なら、その
ままMFCが参考になるけど、複雑怪奇なので理解するのはちと大変かも。

一言で言うなら、
あらかじめ連想配列を作成。
連想配列のキーをウィンドウメッセージ(UINT)、値をメッセージハンドラと
なる関数の関数ポインタにする。
そんだけ。

で、メッセージが飛んできたら、連想配列からメッセージハンドラの関数ポイ
ンタを取得して呼び出すと。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました