CLISP外国金融机构外币价值问题

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

我正在尝试使用CLISP FFI调用一些Win32函数

我能够发出一个调用,并在Lisp中进行回调,但现在我不知道如何访问传递给回调的值

其中一个值是指向结构的指针。我已经定义好了结构,我可以打印它并获取一个或将其包装在外部地址中,但也不能获取实际值或addr,但当我尝试对其进行deref时,我会得到以下结果:

*** - 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位操作系统,我想知道这是不是把事情搞砸了?