From: Berlin B. <ber...@gm...> - 2004-12-14 15:43:15
|
I am working on a small lisp library using FFI, simple question, I am having trouble getting values that have been loaded in lisp and then getting them out to a C environment. For example, here is a struct(basically a win32 struct) and then I place a variables instance in a function in let ... but I keep getting clisp 'foreign-values errors' that say I cant convert from lisp to a foreign-value. ;;; ;;; Author: Berlin Brown ;;; ;;; Date: 12/14/2004 ;;; ;;; $Id$ ;;; ;;; ;;; Note: FFI:C-PTR is a keyword denoting a pointer of type x ;;; (defpackage #:widget-toolkit-test (:use #:common-lisp #:ffi) (:export #:run-test-suite)) ;;; define this package (in-package #:widget-toolkit-test) (eval-when (compile) (setq FFI:*OUTPUT-C-FUNCTIONS* t)) (default-foreign-language :stdc) ;;; ;;; Member Functions /// ;;; ;;; ;;; Test WNDPROC ;;; (defun test-wndproc (hwnd message wparam lparam) (declare (type ffi:c-pointer hwnd)) (declare (type ffi:uint message)) (declare (type ffi:long lparam)) ;;; return ;;; (let ((lresult -1)) (declare (type long lresult)) lresult)) ;;; ;;; WNDCLASSEX ;;; note: typedef CONST CHAR *LPCCH,*PCSTR,*LPCSTR; ;;; ;;; typedef WORD *PWORD,*LPWORD, whenever you ;;; see PWORD = WORD* ;;; ;;; ;;; invalid: (b (c-pointer (c-function ;;; invalid: (:arguments (v int))) d)) ;;; (def-c-struct test-wndclassex (cbSize uint) (style uint) (lpfnWndProc (c-function (:arguments (hwnd ffi:c-pointer) (message ffi:uint) (lparam ffi:uint)) (:language :stdc) (:return-type ffi:long))) (cbClsExtra int) (cbWndExtra int) (hInstance c-pointer) (hIcon c-pointer) (hCursor c-pointer) (hbrBackground c-pointer) (lpszMenuName c-string) (lpszClassName c-string) (hIconSm c-pointer)) ;;; ;;; DLLIMPORT unsigned int WidgetSizeofWND(); ;;; DLLIMPORT void* WidgetDefaultIcon(); ;;; DLLIMPORT void* WidgetDefaultCursor(); ;;; DLLIMPORT void* WidgetDefaultBrush(); ;;; ;;; Default Widget Create Handles: ;;; (def-call-out widget-testpointer (:name "TestPointer") (:arguments (lisp-wndclass-ptr (c-ptr test-wndclassex))) (:return-type) (:library "WidgetToolkit.dll")) (def-call-out widget-sizeof-wnd (:name "WidgetSizeofWND") (:arguments) (:return-type ffi:c-pointer) (:library "WidgetToolkit.dll")) (def-call-out widget-defaulticon (:name "WidgetDefaultIcon") (:arguments) (:return-type ffi:c-pointer) (:library "WidgetToolkit.dll")) (def-call-out widget-defaultcursor (:name "WidgetDefaultCursor") (:arguments) (:return-type ffi:c-pointer) (:library "WidgetToolkit.dll")) (def-call-out widget-defaultbrush (:name "WidgetDefaultBrush") (:arguments) (:return-type ffi:c-pointer) (:library "WidgetToolkit.dll")) ;;; ;;; Run the set of tests ;;; (defun run-test-suite () (print "/// test suite begin .....") (let ((wnd (make-test-wndclassex :cbSize (widget-sizeof-wnd) :style 0 :lpfnWndProc #'test-wndproc :cbClsExtra 0 :cbWndExtra 0 :hInstance nil :hIcon (widget-defaulticon) :hCursor (widget-defaultcursor) :hbrBackground (widget-defaultbrush) :lpszMenuName "NONE" :lpszClassName "gClassName" :hIconSm (widget-defaulticon) ))) ;;(print (slot-value wnd 'cbSize)) ;;(print (slot-value wnd 'hIcon)) (def-c-var aa ( :type (c-ptr test-wndclassex))) ;;(widget-testpointer aa) ;;;(ffi:c-var-address wnd) ;;; ;;; Problem Area here!!!!!!!!!!!!!!!!!!!!!!!!!!!1111 ) ;;; Exit (print "..... test suite end ///")) (provide "widget-toolkit-test") ;;; ;;; End of File ;;; |
From: Sam S. <sd...@gn...> - 2004-12-14 15:50:53
|
> * Berlin Brown <oreyva.oebja@tznvy.pbz> [2004-12-14 10:43:09 -0500]: > > I am working on a small lisp library using FFI, simple question, I am > having trouble getting values that have been loaded in lisp and then > getting them out to a C environment. For example, here is a > struct(basically a win32 struct) and then I place a variables instance > in a function in let ... but I keep getting clisp 'foreign-values > errors' that say I cant convert from lisp to a foreign-value. could you please show a _small_ code snippet with the precise error message? -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> Bill Gates is great, as long as `bill' is a verb. |
From: Sam S. <sd...@gn...> - 2004-12-14 17:48:54
|
> * Berlin Brown <oreyva.oebja@tznvy.pbz> [2004-12-14 12:31:53 -0500]: > > widget-testpointer is a C function, defined in a DLL, the exact same > struct is defined in C and this function has one argument, a pointer > to that particular struct. And I cant seem to pass the reference of > that struct to C. And I did already define the callout, in earlier > code. did you define the lisp struct with def-c-struct? >> could you please show a _small_ code snippet with the precise error message? -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> Isn't "Microsoft Works" an advertisement lie? |
From: Berlin B. <ber...@gm...> - 2004-12-14 18:35:04
|
Yes: (def-c-struct lisp-wndclassex (cbSize uint) (style uint) (lpfnWndProc c-pointer) (cbClsExtra int) (cbWndExtra int) (hInstance c-pointer) (hIcon c-pointer) (hCursor c-pointer) (hbrBackground c-pointer) (lpszMenuName c-string) (lpszClassName c-string) (hIconSm c-pointer)) On Tue, 14 Dec 2004 12:48:42 -0500, Sam Steingold <sd...@gn...> wrote: > > * Berlin Brown <oreyva.oebja@tznvy.pbz> [2004-12-14 12:31:53 -0500]: > > > > widget-testpointer is a C function, defined in a DLL, the exact same > > struct is defined in C and this function has one argument, a pointer > > to that particular struct. And I cant seem to pass the reference of > > that struct to C. And I did already define the callout, in earlier > > code. > > did you define the lisp struct with def-c-struct? > > >> could you please show a _small_ code snippet with the precise error message? > > -- > Sam Steingold (http://www.podval.org/~sds) running w2k > <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> > <http://www.mideasttruth.com/> <http://www.honestreporting.com> > Isn't "Microsoft Works" an advertisement lie? > |
From: Berlin B. <ber...@gm...> - 2004-12-14 17:31:56
|
Assume that test-wndclassex is a struct, actually the values are shown below, and (widget-testpointer wnd) widget-testpointer is a C function, defined in a DLL, the exact same struct is defined in C and this function has one argument, a pointer to that particular struct. And I cant seem to pass the reference of that struct to C. And I did already define the callout, in earlier code. DLLIMPORT void widget_testpointer(SOME_STRUCT *ptr) { } ;; Loaded file widget-test.lisp "/// test suite begin ....." *** - #<FOREIGN-ADDRESS #x00000030> cannot be converted to the foreign type FFI:UINT (let ((wnd (make-test-wndclassex :cbSize (widget-sizeof-wnd) :style 0 :lpfnWndProc #'test-wndproc :cbClsExtra 0 :cbWndExtra 0 :hInstance nil :hIcon (widget-defaulticon) :hCursor (widget-defaultcursor) :hbrBackground (widget-defaultbrush) :lpszMenuName "NONE" :lpszClassName "gClassName" :hIconSm (widget-defaulticon) )) ) ;;(print (slot-value wnd 'cbSize)) ;;(print (slot-value wnd 'hIcon)) (widget-testpointer wnd) ;;;; ERROR CAUSED ABOVE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;(widget-testpointer On Tue, 14 Dec 2004 10:50:35 -0500, Sam Steingold <sd...@gn...> wrote: > > * Berlin Brown <oreyva.oebja@tznvy.pbz> [2004-12-14 10:43:09 -0500]: > > > > I am working on a small lisp library using FFI, simple question, I am > > having trouble getting values that have been loaded in lisp and then > > getting them out to a C environment. For example, here is a > > struct(basically a win32 struct) and then I place a variables instance > > in a function in let ... but I keep getting clisp 'foreign-values > > errors' that say I cant convert from lisp to a foreign-value. > > could you please show a _small_ code snippet with the precise error message? > > -- > Sam Steingold (http://www.podval.org/~sds) running w2k > <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> > <http://www.mideasttruth.com/> <http://www.honestreporting.com> > Bill Gates is great, as long as `bill' is a verb. > |