[Ecls-list] updating refererence pointers in UFFI
Dean O'Connor
Dean.OConnor at ite.com.au
Wed Aug 30 09:17:33 UTC 2006
Great stuff mate !!
Thanks heaps, that worked nicely.
Yeah just called ffi:free-foreign-object after copying it to a lisp var
using ffi:deref-pointer to free the dynamic string.
Cheers
deano
-----Original Message-----
From: Dustin Long [mailto:dlong at stevens.edu]
Sent: Wednesday, 30 August 2006 4:34 PM
To: Dean O'Connor
Cc: ecls-list at lists.sourceforge.net
Subject: Re: [Ecls-list] updating refererence pointers in UFFI
I've got some ecl+sqlite code lying around that I believe demonstrates
what you are looking for.
Here err-message is a c-string passed back by the dll:
(ffi:def-foreign-type str-pointer (* (* :unsigned-char)))
(ffi:def-function ("sqlite3_exec" sqlite3_exec)
((db sqlite3-db)
(sqlcmd :cstring)
(callback :pointer-void)
(dunno :int)
(err-message (* (* :unsigned-char))))
:module "sqlite.dll"
:returning :int)
...
(let ((err-ptr (ffi:allocate-foreign-object 'str-pointer)))
(sqlite3_exec db-conn sql-stm (ffi:callback 'sql-callback) 0
err-ptr))
...
To my knowledge, sqlite is giving back pointers to statically allocated
strings. If, in your case, the c code is allocating the memory, you'll
need to call it again when you want to free.
Hope this helps!
Dustin
Dean O'Connor wrote:
> I may have asked his ages ago but can't seem to find any record of it.
>
> I should probably post this on some UFFI mail list if I can find one
> aswell, but any ideas with ECL.
>
> I am using UFFI to call our DLL (written in C) functions and most of
it
> works ok.
> I can pass cstrings ok as in cl_init().
>
> But other functions such as cl_elementGetAttachment() creates C
strings
> and return them by assigning them to dereferenced argument pointers.
> Also pointers to longs are dereferenced.
> Eg. for the "attachment" argument, in C we pass the address of a C
> string pointer. This get updated with the newly allocated C string
> pointer.
>
> So is there any way to pass the C-function via UFFI a C pointer arg of
> somekind and have it updated when returning to Lisp ??
> It doesn't seem to fit in with the Lisp way of doing things, but is
this
> possible in any way ?
>
> I am not compiling any of this in Windows. Its just pure interpretive.
>
> long cl_init(const char *configFileName);
>
> ((ffi:def-function ("cl_init" init)
> ((configFileName :cstring ))
> :returning :long
> )
>
>
> long cl_elementGetAttachment(long hDoc, unsigned int index, char
**name,
> char **attachment, unsigned long *attachmentSize, bool detach);
>
> ((ffi:def-function ("cl_elementgetattachment" element-get-attachment)
> ((hdoc :long) (index :unsigned-short) (name
> :pointer-void)
> (attachment :pointer-void) (attachmentsize
> :pointer-void)
> (detach :unsigned-char))
> :returning
> :long
> :module
> :default))
>
> Cheers
> deano
>
>
>
------------------------------------------------------------------------
-
> Using Tomcat but need to do more? Need to support web services,
security?
> Get stuff done quickly with pre-integrated technology to make your job
easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache
Geronimo
>
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Ecls-list mailing list
> Ecls-list at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ecls-list
>
>
More information about the ecl-devel
mailing list