ページ 11

関数ポインタについて

Posted: 2007年5月13日(日) 21:59
by ゲスト
クラス内のコールバック関数にて関数ポインタを使用しています。
AddressOfでアドレスを取得し代入する訳ですが
クラスの変数を使用した場合、関数ポインタの箇所でアクセス違反となります。
thisポインタを引数にすれば良いとありましたが、どうすれば良いのでしょうか

Re: 関数ポインタについて

Posted: 2007年5月13日(日) 22:34
by ゲスト
> クラス内のコールバック関数にて関数ポインタを使用しています。
> AddressOfでアドレスを取得し代入する訳ですが
> クラスの変数を使用した場合、関数ポインタの箇所でアクセス違反となります。
>
> > thisポインタを引数にすれば良いとありましたが、どうすれば良いのでしょうか
> Dim a As *A
> a=New A
>
> a->Message(WM_CREATE,AddressOf(OnCreate))
>
> Sub OnCreate()
> OutputDebugString("ok")
> End Sub[/code][/hide]
の部分が良く分からないのですが、OnCreateはクラスの外にあるのでしょうか?
それとも内にあるのでしょうか?

OnCreateがクラスの外にあってエラーとなるのでしたらActiveBasicのバグですが
クラスの内にあるのでしたら仕様です。

この場合、OnCreate()には一見すると引数が無いように見えますが、実際には
OnCreate(this As *A)という引数が隠れています。

ですから、下記のように関数ポインタに引数を追加すれば動くのではないかと思います。

Posted: 2007年5月14日(月) 00:49
by ゲスト
OnCreateはクラスの外にあります
コールバック関数の方で直接だと上手く行くんですが
他の関数だと…

Posted: 2007年5月14日(月) 00:50
by ゲスト
OnCreateはクラスの外にあります
コールバック関数の方で直接だと上手く行くんですが
他の関数だと…

Posted: 2007年5月14日(月) 01:22
by ゲスト
言葉足らずで申し訳ありません

クラスの中で関数を呼んだ場合何の問題もありません。
ですが、Newで出来たものを呼んだ場合アクセス違反になるんです
クラスの中で使用した場合と、->で使用した場合
は同じ事ですよね?

仕様ということでしょうか…。

Posted: 2007年5月14日(月) 01:38
by ゲスト
解決しました、ありがとうございました
またお騒がせして大変申し訳ありませんでした