Access 97でAddressOfを実現する方法
-
解説
Access 97では2000以降にあるAddressOf演算子が使用できないので関数のアドレスが取得できません。
このため、EnumWindows APIで使用するコールバック関数やSetWindowLong APIでWindowProcを置き換えるといったことができません。しかし、そんなことであきらめる雅ではありません。
探しに探して海外で見つけました。VBA332.DLLに隠しAPIがあるようです。
(EbGetExecutingProj, TipGetFunctionId, TipGetLpfnOfFunctionId)
これらのAPIを使用しアドレスを取得します。流れは
- EbGetExecutingProjでプロジェクトハンドルを取得する
- TipGetFunctionIdでファンクションIDを取得する
- TipGetLpfnOfFunctionIdでファンクションアドレスを取得する
といった感じになります。
-
サンプル(雅のコーディングスタイルにアレンジしています)
標準モジュール
Option Compare Database Option Explicit Private Declare Function EbGetExecutingProj Lib "vba332.dll" _ (ProjectHandle As Long) As Long Private Declare Function TipGetFunctionId Lib "vba332.dll" _ (ByVal ProjectHandle As Long, _ ByVal FunctionName As String, _ ByRef FunctionID As String) As Long Private Declare Function TipGetLpfnOfFunctionId Lib "vba332.dll" _ (ByVal ProjectHandle As Long, _ ByVal FunctionID As String, _ ByRef FunctionAddress As Long) As Long Public Function AddressOfValue(ByVal FunctionName As String) As Long Dim ProjectHandle As Long Dim FunctionID As String Dim ReturnValue As Long Dim UnicodeFunctionName As String Const NO_ERROR As Long = 0 EbGetExecutingProj ProjectHandle If ProjectHandle = 0 Then Exit Function End If UnicodeFunctionName = StrConv(FunctionName, vbUnicode) If TipGetFunctionId(ProjectHandle, UnicodeFunctionName, FunctionID) <> NO_ERROR Then Exit Function End If If TipGetLpfnOfFunctionId(ProjectHandle, FunctionID, ReturnValue) = NO_ERROR Then AddressOfValue = ReturnValue End If End Function
使用方法は
AddressValue = AddressOfValue("関数名")
と、なります。
-
その他
AccessのVBAおよびAPIの知識が必要です。
スポンサーリンク
スポンサーリンク
説明がわからないなどありましたらお問い合わせでお知らせください。
ここに掲載された情報を使用したことによって発生した、いかなる損害に対しても
管理者である雅は一切責任を負いません。