CLISP外国金融机构外币价值问题
我正在尝试使用CLISP FFI调用一些Win32函数 我能够发出一个调用,并在Lisp中进行回调,但现在我不知道如何访问传递给回调的值 其中一个值是指向结构的指针。我已经定义好了结构,我可以打印它并获取一个或将其包装在外部地址中,但也不能获取实际值或addr,但当我尝试对其进行deref时,我会得到以下结果:CLISP外国金融机构外币价值问题,lisp,common-lisp,ffi,clisp,Lisp,Common Lisp,Ffi,Clisp,我正在尝试使用CLISP FFI调用一些Win32函数 我能够发出一个调用,并在Lisp中进行回调,但现在我不知道如何访问传递给回调的值 其中一个值是指向结构的指针。我已经定义好了结构,我可以打印它并获取一个或将其包装在外部地址中,但也不能获取实际值或addr,但当我尝试对其进行deref时,我会得到以下结果: *** - FFI:DEREF is only allowed after FFI:FOREIGN-VALUE: (FFI:DEREF (FFI:FOREIGN-ADDRESS PR
*** - FFI:DEREF is only allowed after FFI:FOREIGN-VALUE:
(FFI:DEREF (FFI:FOREIGN-ADDRESS PRECT*))
我试着用外文值包装外文地址调用,试着用-c-place和其他东西,但没有任何效果。我要么什么也没打印出来,在这种情况下,我假设在通话过程中出现了错误,然后它就坏了,要么我就得到了那个错误
我能找到的唯一的文档是,但它的示例很少,而且这些函数的文档也不清楚
有人有什么建议吗?双关语我应该切换到CFFI/UFFI还是SBCL偶数
更新
我让它在将指针包装成外值后打印出一次结构,在REPL中重新加载它而不退出,然后在后续重新加载的回调中它似乎出错了
编辑
仍然无法让它工作;代码如下:
(defpackage "WIN32")
(in-package "WIN32")
(use-package "FFI")
; Listen for a WM_DISPLAYCHANGE message to get notifications of when
; a monitor (setting) is added/removed/changed
(def-c-type BOOL boolean)
(def-c-type CHAR char)
(def-c-type DWORD uint)
(def-c-type HANDLE c-pointer)
(def-c-type HDC HANDLE)
(def-c-type HMONITOR HANDLE)
(def-c-type HWND HANDLE)
(def-c-type LONG long)
(def-c-type LPARAM c-pointer)
(def-c-type LPCSTR c-string)
(def-c-type LPCTSTR LPCSTR) ; LPCWSTR
;(def-c-type LPCWSTR )
(def-c-type TCHAR CHAR) ; WCHAR
;(def-c-type WCHAR )
(defun symbol-to-keyword (sym)
(intern (symbol-name sym) :keyword))
(defun affix-to-symbol (prefix sym suffix)
(intern (concatenate 'string prefix (symbol-name sym) suffix)))
(defun car-symbol-to-keyword (pair)
(cons
(symbol-to-keyword (car pair))
(cdr pair)))
(defmacro def-struct-type (name &rest fields)
`(progn
(def-c-struct ,name ,@fields)
(def-c-type
,(affix-to-symbol "P" name "")
(c-pointer ,name))
(defconstant
,(affix-to-symbol "" name "-INSTANCE")
'(c-struct ,name ,@(mapcar #'car-symbol-to-keyword fields)))
))
;typedef struct _RECT {
; LONG left;
; LONG top;
; LONG right;
; LONG bottom;
;} RECT, *PRECT;
(def-struct-type RECT
(left LONG)
(top LONG)
(right LONG)
(bottom LONG))
;BOOL CALLBACK MonitorEnumProc(
; _In_ HMONITOR hMonitor,
; _In_ HDC hdcMonitor,
; _In_ LPRECT lprcMonitor,
; _In_ LPARAM dwData
;);
;BOOL EnumDisplayMonitors(
; _In_ HDC hdc,
; _In_ LPCRECT lprcClip,
; _In_ MONITORENUMPROC lpfnEnum,
; _In_ LPARAM dwData
;);
(def-call-out EnumDisplayMonitors
(:name "EnumDisplayMonitors")
(:library "User32.dll")
(:arguments
(hdc HDC)
(lprcClip PRECT)
(lpfnEnum
(c-function
(:arguments
(hMonitor HMONITOR)
(hdcMonitor HDC)
(lprcMonitor PRECT)
(dwData LPARAM))
(:return-type BOOL)
(:language :stdc-stdcall)))
(dwData LPARAM))
(:return-type BOOL)
(:language :stdc-stdcall))
(export 'EnumDisplayMonitors)
(defun callback (hmon hdc* prect* data)
(progn
(format t "~A ~A ~A ~A~%" hmon hdc* (foreign-address prect*) data)
t))
(EnumDisplayMonitors nil nil #'callback nil)
使用slot和c-var-object
见和
更多例子
您可以在中找到更多示例
和
和
和
更多外国金融机构模块
将来
确实,这些天SBCL比CLSISP维护得更好,所以你可能需要考虑切换。谢谢你的回复。我试着搞乱这些,但还是不能让事情正常进行。我已经更新了我的问题以包含代码。顺便说一句,我正在开发一个64位操作系统,我想知道这是不是把事情搞砸了?