本日要介紹的是 Common Lisp 的 FFI(Foreign Function Interface)的使用.
FFI 是 Common Lisp 和 C 程式溝通的介面, 雖然 Common Lisp 中有較泛用的 UFFI, CFFI 等等.
不過那些據我測試都比較難用, 因此這邊先來介紹 Lispwork 專屬的 FLI(Foriegn Library Interface)
這裡的範例主要是使用 FindWindow 找出某個視窗, 並用 SetWindowText 修改其 Title
; 設定 Type : HWND
(fli:define-c-typedef fli-hwnd
(:unsigned :long))
這邊在 Lispwork 中已經是內建的 Package 了( 自動載入 )
所以不用下什麼 load require 或是 asdf-load 之類的載入指令
一開始最重要的是宣告 HWND 這個型態...
在 windows.h 中我們得知 HWND 是 unsigned long
所以就比照它的宣告一下 fli-hwnd 是 unsigned long
; 設定 Find Window
(fli:define-foreign-function (find-window "FindWindowW")
((lpstring1 (:reference-pass :ef-wc-string :allow-null t))
(lpstring2 (:reference-pass :ef-wc-string :allow-null t)))
:result-type fli-hwnd)
定義 Function, 其實, 如果是 CFFI 的話,
還多一個步驟是, 宣告使用的 library user32.dll, 並載入 user32.dll
不過 Lispwork 的 FLI 覺得這個太常用了, 已經幫你載入了,
所以不用特別宣告
這裡定義 find-window 為 "FindWindowW" (後面的 W 代表是 Unicode 版)
參數給兩個, 為了省麻煩我用 lpstring1 及 lpstring2 代替
其實可以用真正的意義啦, 一個是 class 名稱, 一個是 title 名稱
後面的參數意義如下:
:reference-pass 表示這是 constant
:ef-wc-string 表示這是 WCHAR 的字串
所以合在一起就是 LPCWSTR 的意思
:allow-null t 表示傳入 Common Lisp 的 nil 時會自動轉成 NULL
傳回值為 fli-hwnd
; 設定 Set Window Text
(fli:define-foreign-function (set-window-text "SetWindowTextW")
((hwnd fli-hwnd)
(lpstring1 (:reference-pass :ef-wc-string :allow-null t)))
:result-type :boolean
:documentation "Sets the text of the window titlebar.")
這個和上面的沒什咩不同, 不過多了一個 :documentation 表示函式註解
在 Common Lisp 中其實函式註解都可以查得到的
接下來就可以試試
(set-window-text (find-window nil 字串) 字串)
看看所指定的視窗的 Title 是否有改變
2007年4月24日星期二
訂閱:
張貼意見 (Atom)
0 意見:
張貼意見