我是 Common Lisp 的新手,并在上面做了一些实验。我正在努力获得对 Windows 剪贴板的访问权限,然后我找到了这个参考:
https://groups.google.com/forum/#!topic/comp.lang.lisp/hyNqn2QhUY0
这是完美的,除了它是为 CLISP FFI 量身定制的,我希望它与 CFFI 一起使用。然后我尝试转换代码,并部分成功,但例程(get-clip-string)存在问题,在 WinXP(!)上使用 Clozure CL 1.10 进行测试:
测试文本:拥有太空服-Will Travel
? (获取剪辑字符串)
错误:值“拥有太空服-将旅行”不是预期的类型(UNSIGNED-BYTE 32)。执行时:GLOBAL-LOCK-STRING,在进程监听器(1)中。键入 :POP 以中止, :R 以获取可用重新启动的列表。类型 :?其他选项。
我想我没有得到 CFFI 上的类型(虽然我已经阅读了手册),或者 CLISP 上的原始处方。有人提示吗?以下命令序列有效,但恐怕这不安全:
(open-clip 0)
(get-clip 1)
(close-clip 0)
(open-clip 0) (get-clip 1) (close-clip 0)
这是代码:
(ql:quickload :cffi)
(cffi:load-foreign-library "user32.dll")
(cffi:load-foreign-library "kernel32.dll")
(cffi:load-foreign-library "msvcrt.dll")
(cffi:defcfun ("GetClipboardData" get-clip) :string
(uformat :unsigned-int))
(cffi:defcfun ("OpenClipboard" open-clip) :int
(hOwner :unsigned-int))
(cffi:defcfun ("CloseClipboard" close-clip) :int
(hOwner :unsigned-int))
(cffi:defcfun ("EmptyClipboard" empty-clip) :int)
(cffi:defcfun ("SetClipboardData" set-clip) :int
(data :unsigned-int)
(format :unsigned-int))
(cffi:defcfun ("GlobalAlloc" global-alloc) :int
(flags :unsigned-int)
(numbytes :unsigned-int))
(cffi:defcfun ("GlobalLock" global-lock) :unsigned-int
(typ :unsigned-int))
(cffi:defcfun ("GlobalLock" global-lock-string) :string
(typ :unsigned-int))
(cffi:defcfun ("GlobalUnlock" global-unlock) :int
(typ :unsigned-int))
(cffi:defcfun ("memcpy" memcpy) :int
(dest :unsigned-int)
(src :string)
(coun :unsigned-int))
(defun get-clip-string ()
(open-clip 0)
(let* ((h (get-clip 1)) (s (global-lock-string h)))
(global-unlock h) (close-clip 0) s))
(defun set-clip-string (s)
(let* ((slen (+ 1 (length s)))(newh (global-alloc 8194 slen))
(newp (global-lock newh)))
(memcpy newp s (+ 1 slen)) (global-unlock newh) (open-clip 0)
(set-clip 1 newh) (close-clip 0)))