by ゲスト » 2007年5月13日(日) 22:34
> クラス内のコールバック関数にて関数ポインタを使用しています。
> AddressOfでアドレスを取得し代入する訳ですが
> クラスの変数を使用した場合、関数ポインタの箇所でアクセス違反となります。
>
>
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
> Class A
> Function Proc(hwnd As DWord,msg As DWord,wParam As WPARAM,lParam As LPARAM) As LRESULT
> '略
> pMessage()'ここでアクセス違反
> End Function
> Public
> Sub Message(message As DWord,fn As DWord)
> pMessage=fn
> End Sub
> Public
> pMessage *Sub()
> End Class
>
> Dim a As *A
> a=New A
>
> a->Message(WM_CREATE,AddressOf(OnCreate))
>
> Sub OnCreate()
> OutputDebugString("ok")
> End Sub
> 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)という引数が隠れています。
ですから、下記のように関数ポインタに引数を追加すれば動くのではないかと思います。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Class A
Public
Sub A()
Message(WM_CREATE,AddressOf(OnCreate))
End Sub
Private
Function Proc(hwnd As DWord,msg As DWord,wParam As WPARAM,lParam As LPARAM) As LRESULT
pMessage(VarPtr(This))
End Function
Public
Sub Message(message As DWord,fn As DWord)
pMessage=fn
End Sub
Public
pMessage *Sub(this As *A)
Sub OnCreate()
OutputDebugString("ok")
End Sub
End Class
Dim a As *A
a=New A
~~~
Delete a
> クラス内のコールバック関数にて関数ポインタを使用しています。
> AddressOfでアドレスを取得し代入する訳ですが
> クラスの変数を使用した場合、関数ポインタの箇所でアクセス違反となります。
>
> [hide][code]
> Class A
> Function Proc(hwnd As DWord,msg As DWord,wParam As WPARAM,lParam As LPARAM) As LRESULT
> '略
> pMessage()'ここでアクセス違反
> End Function
> Public
> Sub Message(message As DWord,fn As DWord)
> pMessage=fn
> End Sub
> Public
> pMessage *Sub()
> End Class
>
> Dim a As *A
> a=New A
>
> a->Message(WM_CREATE,AddressOf(OnCreate))
>
> Sub OnCreate()
> OutputDebugString("ok")
> End Sub[/code][/hide]
> thisポインタを引数にすれば良いとありましたが、どうすれば良いのでしょうか
[quote]> Dim a As *A
> a=New A
>
> a->Message(WM_CREATE,AddressOf(OnCreate))
>
> Sub OnCreate()
> OutputDebugString("ok")
> End Sub[/code][/hide]
[/quote]
の部分が良く分からないのですが、OnCreateはクラスの外にあるのでしょうか?
それとも内にあるのでしょうか?
OnCreateがクラスの外にあってエラーとなるのでしたらActiveBasicのバグですが
クラスの内にあるのでしたら仕様です。
この場合、OnCreate()には一見すると引数が無いように見えますが、実際には
OnCreate(this As *A)という引数が隠れています。
ですから、下記のように関数ポインタに引数を追加すれば動くのではないかと思います。
[hide][code]
Class A
Public
Sub A()
Message(WM_CREATE,AddressOf(OnCreate))
End Sub
Private
Function Proc(hwnd As DWord,msg As DWord,wParam As WPARAM,lParam As LPARAM) As LRESULT
pMessage(VarPtr(This))
End Function
Public
Sub Message(message As DWord,fn As DWord)
pMessage=fn
End Sub
Public
pMessage *Sub(this As *A)
Sub OnCreate()
OutputDebugString("ok")
End Sub
End Class
Dim a As *A
a=New A
~~~
Delete a
[/code][/hide]