関数ポインタ

今回はAB4.xxで導入された新機能、関数ポインタについて簡単に説明します。
普通の関数の呼び出しはヘルプにありますので、DLLの関数を呼び出してみます。
DLLは前に、Declare Function~で宣言するといいました。もちろん、この方法でもいいのですが問題もあります。
それは、起動時にそのファイルが無いとエラーになるということです。
DLLが見つかりません。のダイアログ
このようなダイアログがでて、プログラムが起動すらしません。
しかし関数ポインタを利用すると、DLLに含まれる関数を使えないだけで起動はできるようになります。
DLLが無くても上のようなダイアログは出てきません。
以下はMessageBox関数を関数ポインタで呼び出すプログラムです。
'関数ポインタ
Dim pMsgBox As *Function(hWnd As HWND, _
        lpText As BytePtr, lpCaption As BytePtr, _
        uType As DWord) As Long
Dim hInst As HINSTANCE

hInst = LoadLibrary("user32.dll")
If hInst = 0 Then
    MessageBox(0,"ロードエラー" , "ERROR!" , MB_OK)
    ExitProcess(0)
End If

pMsgBox = GetProcAddress(hInst , "MessageBoxA")
If pMsgBox = 0 Then
    MessageBox(0,"ロードエラー" , "ERROR!" , MB_OK)
    ExitProcess(0)
End If

pMsgBox(0,"test" , "test" , MB_OK)

FreeLibrary(hInst)
最初の行で、関数ポインタを宣言しています。
LoadLibrary関数でDLLのインスタンスハンドル(アプリそのものをあらわす値)を、
GetProcAddress関数でMessageBoxA関数のアドレスを取得しています。

(補足)
MessageBox関数は実はMessageBoxAとMessageBoxWの2つがあります。
MessageBox関数に限らず、文字列が絡む関数はAとWの2つがあります。
関数内部で文字列の扱いが異なり、AはANSIにWはunicodeで扱います。
ABは文字列の扱いがunicodeではないので、Wのつく関数は正常な動作はしません。

後はpMsgBox(0,"test" , "test" , MB_OK)のように普通の関数と同じように使うことができます。
pMsgBoxはポインタなので、演算(足したり引いたり)することもできます。
最後にFreeLibraryでモジュールを開放しておきます。