ray88’s diary

お仕事で困ったとき用の自分用の覚書

Win64 API 宣言の書式

Win64 APIの書式
------------------------------------------------------------------------------
Declare PtrSafe Function Getwindowsdiretory Lib "kernel32" _
Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, _
ByVal nSize As Long) As LongPtr
-------------------------------------------------------------------------------
解説

PtrSafe
 Win64 APIをコールするときは、まず、PtrSafeキーワードを使用して64ビットVBA
 コンパイルする。

Function Getwindowsdiretory
 関数名を指定する。基本的にC言語で宣言されたAPIの関数名と同じものを使う。
 まだ、Win64 APIは関数なので値を返す。そこで、Functionキーワードを使用し、
 関数形式で宣言する。
 ※値を返さないAPI関数の時はSubキーワードを使用する。

Lib "kernel32"
 ライブラリの指定。API関数が格納されているDLLを記述します。これがないとVBA
 API関数の所在が分からない。Windowsライブラリの「Kernel32.dll」「User32.dll」
  「Gbi32.dll」の3つに限り拡張子を省略できるが、その他のライブラリにあるAPI関数
 を呼び出すときには「Lib "advapi32.dll」のように拡張子を含めて記述する。

Alias "GetWindowsDirectoryA" 
 DLLで公開されている正式な関数名の指定。APIはDLLの中では別の名前で公開されて
 いるケースがある。その場合、Alias節で公開されている関数名を宣言する。

lpBuffer As String  nSize As Long
 C言語では引数「lpBuffer」のデータ型は「LPTSTR」で宣言されているが、VBAには
 そのようなデータ型がないためString型に変換して宣言している。同様にデータ型
 「UNIT」はlong型に変換されている。

As LongPtr
   戻り値のデータ型の指定。GetWindowsDirectoryAは「UNIT」型のデータ型を返すこと
 がC言語の宣言書式からわかる。そこで、戻り値の型をVBAの「LongPtr型」に変換
 している。