Hello,<div><br></div><div> I have a strange issue with a simple FFI example for CCL 1.5 ("Version 1.5-r13651  (WindowsX8664)") running on Win7 x64.</div><div><br></div><div>There is a dynamic library which exports this function:</div>
<div><br></div><div><div>extern "C" {</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>SAMPLELIB_API int increment_array(double flag, unsigned short* array)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>if (flag > 6.3) {</div><div><span class="Apple-tab-span" style="white-space:pre">                 </span>array[0] = 83;</div><div><span class="Apple-tab-span" style="white-space:pre">                       </span>array[1] += 2;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span>array[2] += 7;</div><div><span class="Apple-tab-span" style="white-space:pre">                       </span>array[3] = 61372;</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>return 1;</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                     </span>array[0] = 726;</div><div><span class="Apple-tab-span" style="white-space:pre">                      </span>array[1] += 111;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span>array[2] += 222;</div><div><span class="Apple-tab-span" style="white-space:pre">                     </span>array[3] = 888;</div><div><span class="Apple-tab-span" style="white-space:pre">                      </span>return 2;</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>}</div><div>}</div></div><div><br></div><div><br></div><div>And the code below tries to invoke the foreign function:</div>
<div><br></div><div><div>(defun allocate-sample-array (required-length initial-value)</div><div>  (declare (type fixnum required-length))</div><div>  (declare (type (unsigned-byte 16) initial-value))</div><div>  (multiple-value-bind (array pointer)</div>
<div>      (make-heap-ivector required-length '(unsigned-byte 16))</div><div>    (loop for i from 0 below required-length do</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> (setf (aref array i) initial-value))</div>
<div>    (list array pointer)))</div><div><br></div><div>(defun do-test ()</div><div>  (let* ((lib (open-shared-library "D:\\SampleLib.dll"))</div><div><span class="Apple-tab-span" style="white-space:pre">   </span> (array-desc-pair (allocate-sample-array 4 1))</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span> (array (first array-desc-pair))</div><div><span class="Apple-tab-span" style="white-space:pre">     </span> (ptr (second array-desc-pair)))</div><div>    (external-call "increment_array" :double-float 1.5d+2 :address ptr :integer)</div>
<div>    (loop for element across array do (print element))</div><div>    #|(close-shared-library lib)|#))</div></div><div><br></div><div><br></div><div>DO_TEST crashes in EXTERNAL-CALL. Debugging with VS shows that increment_array is invoked, but the second argument is a null pointer. I guess that I have some issue in my code, but I followed <a href="http://openmcl.clozure.com/manual/chapter12.11.html#Tutorial--Allocating-Foreign-Data-on-the-Lisp-Heap">http://openmcl.clozure.com/manual/chapter12.11.html#Tutorial--Allocating-Foreign-Data-on-the-Lisp-Heap</a> while writing it. Could somebody please help me to understand what is wrong?</div>
<div><br></div><div>Also, CLOSE-SHARED-LIBRARY function seems to be absent in this CCL image. Is there any replacement for it?</div><div><br></div><div><br></div><div>Thank you,</div><div>Roman Marynchak </div>