DLLの呼び出し

 マクロの言語仕様だけでは実現できないことも、既存のDLLを呼び出せば実現できることがあります。
 DLLの呼び出しは、使い方を間違えばシステムダウンの原因となります。c言語および Windows API の知識を持った方のみが使用してください。


 DLLから返値以外でデータを受け取る場合、引数に可変長文字列型/固定領域文字列型/ユーザ定義データ型のどれかを指定します。ただし、配列を使用することはできません。
 DLLに渡されるときに自動的にポインタに変換されます。
 可変長文字列型の時は、文字列の最後に '\0' が付加されてDLLに渡されます。
 固定領域文字列型のときは、文字列の長さが最大の長さでないときに限り '\0' が付加されてDLLに渡されます。よって、dim a$ as string[10] として定義したときは、9バイトまでしか代入しないでください。
 引数に NULL を渡したいときは、単に 0 と記述してください。"" と記述すると、'\0' を指すポインタが渡されてしまいます。

 DLLから戻ってきたときに、引数にした可変長文字列型変数の &H00 以降の部分は切り捨てられます。


例1
dllname KERNEL
cdeclarea int GetWindowsDirectory(LPSTR, int);

proc main()
        dim a$ as string
        a$ = string$(256, 0)
        GetWindowsDirectory(a$, 256)

        dim b$ as string[256]
        GetWindowsDirectory(b$, 256)
end proc


例2
type RECT
        Left as default
        Top as default
        Right as default
        Bottom as default
end type

dllname USER
cdeclare void GetWindowRect(HWND, RECT *);

proc main()
        dim rc as RECT

        GetWindowRect(@@hwnd, rc)
        print cformat$("left=%d, top=%d, right=%d, bottom=%d", rc.Left, rc.Top, rc.Right, rc.Bottom)
end proc

最新情報  TOP  マクロTOP