The Device Independent Bitmap (DIB) utilities library DIBUTILS.DLL and the associated procedures in dib.scm in the Win32 system source is an example of how to use the foreign function interface to access and manipulate non-Scheme objects.
In the C world a DIB is a handle to a piece of memory containing the bits that represent information about the image and the pixels of the image. The handle is a machine-word sized piece of data which may be thought of as a 32 bit integer. The handle may be null (i.e. zero), indicating that there is no block of memory describing the DIB. The null value is usually returned by C functions that are supposed to create a DIB but failed, for some reason like the memory could not be allocated or a file could not be opened.
In the Scheme world a DIB is a structure containing information about the bitmap (specifically the integer that represents the handle). We also include
dibwindows type to mirror the null handle error value.(define dib-result (lambda (handle) (if (= handle 0) #f (make-dib handle)))) (define dib-arg (lambda (dib) (if dib (cell-contents (dib-handle dib)) 0))) (define-windows-type dib (lambda (thing) (or (dib? thing) (eq? thing #f))) dib-arg dib-result)