関数ポインタについて

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ゲスト

関数ポインタについて

#1 投稿記事 by ゲスト »

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

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

#2 投稿記事 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)という引数が隠れています。

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

#3 投稿記事 by ゲスト »

OnCreateはクラスの外にあります
コールバック関数の方で直接だと上手く行くんですが
他の関数だと…
ゲスト

#4 投稿記事 by ゲスト »

OnCreateはクラスの外にあります
コールバック関数の方で直接だと上手く行くんですが
他の関数だと…
ゲスト

#5 投稿記事 by ゲスト »

言葉足らずで申し訳ありません

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

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

#6 投稿記事 by ゲスト »

解決しました、ありがとうございました
またお騒がせして大変申し訳ありませんでした
返信する