<div dir="ltr">Hi,<br><br>I&#39;m wrapping Win32 PC/SC and I don&#39;t understand how I should wrap structures. Here is my simplified header:<br><br>============= C HEADER =============<br><br>#define IN /* Tag for INPUT parameters */<br>
#define OUT /* Tag for OUTPUT parameters */<br>&nbsp;<br><br>typedef int DWORD;<br>typedef int LONG;<br><br>typedef LONG SCARDHANDLE;<br><br>typedef unsigned char BYTE;<br>typedef const BYTE* LPCBYTE;<br>typedef DWORD* LPDWORD;<br>
<br>typedef struct _SCARD_IO_REQUEST{<br>&nbsp;&nbsp;&nbsp; DWORD dwProtocol;&nbsp;&nbsp; // Protocol identifier<br>&nbsp;&nbsp;&nbsp; DWORD cbPciLength;&nbsp; // Protocol Control Information Length<br>} SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;<br>
typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST;<br><br><br>LONG SCardTransmit(<br>&nbsp;&nbsp;&nbsp; IN SCARDHANDLE hCard,<br>&nbsp;&nbsp;&nbsp; IN LPCSCARD_IO_REQUEST pioSendPci,<br>&nbsp;&nbsp;&nbsp; IN LPCBYTE pbSendBuffer,<br>&nbsp;&nbsp;&nbsp; IN DWORD cbSendLength,<br>&nbsp;&nbsp;&nbsp; IN OUT LPSCARD_IO_REQUEST pioRecvPci,<br>
&nbsp;&nbsp;&nbsp; OUT LPBYTE pbRecvBuffer,<br>&nbsp;&nbsp;&nbsp; IN OUT LPDWORD pcbRecvLength);<br><br><br>============= END OF C HEADER =============<br><br><br>Here is my conversion attempt:<br><br><br><br>============= SCHEME MODULE&nbsp; =============<br>
<br>;; #lang mzscheme<br>(module winscard mzscheme<br>&nbsp; (require mzlib/foreign) <br>&nbsp; (unsafe!)<br>&nbsp; <br>&nbsp; (define winscard (ffi-lib &quot;winscard&quot;))<br>&nbsp; <br>&nbsp; (define _DWORD _int)<br>&nbsp; (define _LONG _int)<br>&nbsp; (define _SCARDHANDLE _int)<br>
&nbsp; <br>&nbsp; (provide scard-ok)<br>&nbsp; (define (scard-ok scard-error)<br>&nbsp;&nbsp;&nbsp; (= scard-error 0))<br>&nbsp; (provide make-SCARD_IO_REQUEST)<br>&nbsp; (define-cstruct _SCARD_IO_REQUEST ([dwProtocol _DWORD];;&nbsp;&nbsp; // Protocol identifier<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [cbPciLength _DWORD])) ;;&nbsp; // Protocol Control Information Length<br>
&nbsp; <br>&nbsp; #|<br>LONG SCardTransmit(<br>&nbsp;&nbsp;&nbsp; IN SCARDHANDLE hCard,<br>&nbsp;&nbsp;&nbsp; IN LPCSCARD_IO_REQUEST pioSendPci,<br>&nbsp;&nbsp;&nbsp; IN LPCBYTE pbSendBuffer,<br>&nbsp;&nbsp;&nbsp; IN DWORD cbSendLength,<br>&nbsp;&nbsp;&nbsp; IN OUT LPSCARD_IO_REQUEST pioRecvPci,<br>&nbsp;&nbsp;&nbsp; OUT LPBYTE pbRecvBuffer,<br>
&nbsp;&nbsp;&nbsp; IN OUT LPDWORD pcbRecvLength);<br>|#<br>&nbsp; (provide scard-transmit)<br>&nbsp; (define scard-transmit<br>&nbsp;&nbsp;&nbsp; (get-ffi-obj &quot;SCardTransmit&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; winscard<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (_fun (hCard : _SCARDHANDLE) ;; == IN SCARDHANDLE hCard<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pioSendPci : _SCARD_IO_REQUEST-pointer) ;; == IN LPCSCARD_IO_REQUEST pioSendPci<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pbSendBuffer : (_vector i _byte)) ;; == IN LPCBYTE pbSendBuffer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cbSendLength : _DWORD) ;; == IN DWORD cbSendLength<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ioRecvPci : (_ptr io _SCARD_IO_REQUEST)) ;; == IN OUT LPSCARD_IO_REQUEST pioRecvPci<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pbRecvBuffer :&nbsp; (_vector o _byte cbRecvLength)) ;; == OUT LPBYTE pbRecvBuffer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cbRecvLength : (_ptr io _DWORD)) ;; == IN OUT LPDWORD pcbRecvLength<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; (error : _LONG) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; (if (scard-ok error) &#39;(error ioRecvPci pbRecvBuffer cbRecvLength) #f)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )))<br>&nbsp;&nbsp;&nbsp; )<br><br>============= END OF SCHEME MODULE&nbsp; =============<br>
<br><br>============= SCHEME PROGRAM&nbsp; =============<br>(require &quot;winscard.ss&quot;)<br>(require mzlib/foreign) <br>(unsafe!)<br><br>(define hCard 1)<br>(define pioSendPci (make-SCARD_IO_REQUEST #x0002 8))<br>(define pbSendBuffer (make-vector 4 0))<br>
(define cbSendLength 4)<br>(define ioRecvPci (make-SCARD_IO_REQUEST #x0002 8))<br>(define cbRecvLength 4)<br>(scard-transmit <br>&nbsp;hCard <br>&nbsp;pioSendPci <br>&nbsp;pbSendBuffer <br>&nbsp;cbSendLength <br>&nbsp;ioRecvPci <br>&nbsp;;; pbRecvBuffer skipped since it&#39;s an output parameter<br>
&nbsp;cbRecvLength) <br><br>============= END OF SCHEME PROGRAM&nbsp; =============<br><br>Program fails with: &quot;zero?: expects argument of type &lt;real number&gt;; given #&lt;cpointer&gt;&quot;.<br><br>Any hint? Thanks.<br><br>
<br></div>