◆VB初心者質問スレ Part5
■ このスレッドは過去ログ倉庫に格納されています
0316VB使い
NGNGVBはポインタを扱えないので、まぁ基本的に無理ってことで。
ただ、無理やりやるなら
1.アセンブラで関数のポインタに飛ぶコードを書いてVTableを自作し、
VtableにアセンブラコードとポインタをいれてOleaut32のDispCallFuncを
呼び出す
2.クラスを作成しインスタンス化した後Vtableのアドレスを書き換える
とかいう方法があるけどどちらも無理矢理なんでC使えるならDLLを作ることを
お勧めする。
一応1のサンプル。(DispCallFuncについてはまだよく知らないので)
Option Explicit
Private Declare Function DispCallFunc Lib "oleaut32.dll" ( _
ByVal VtblObject As Long, _
ByVal FunctionOffset As Long, _
ByVal CallConv As Long, _
ByVal ReturnType As VBA.VbVarType, _
ByVal ArgsCount As Long, _
ByRef ARefArgsType As Integer, _
ByRef ARefArgs As Long, _
ByRef RefResult As Variant) As Long
Function Func1() As Long
MsgBox ("(・∀・)ウマクイッタ!")
End Function
Sub main()
Dim pFunc As Long
pFunc = GetAddress(AddressOf Func1)
MyCall pFunc'ココがポインタ使ってるとこ。
End Sub
Function GetAddress(Functions As Long) As Long
GetAddress = Functions
End Function
Private Function MyCall(ByVal FunctionPointer As Long) As Long
Dim cd(0 To 7) As Byte 'アセンブラコード
Dim pTable As Long
Dim TableOb(0 To 1) As Long
cd(0) = &H59: cd(1) = &H58: cd(2) = &H51: cd(3) = &HFF: cd(4) = &H60: cd(5) = &H4
pTable = VarPtr(cd(0))
TableOb(0) = VarPtr(pTable)
TableOb(1) = FunctionPointer
DispCallFunc VarPtr(TableOb(0)), 0, 4, vbLong, 0, 0, 0, 0
End Function
■ このスレッドは過去ログ倉庫に格納されています