From: Yaroslav K. <kav...@je...> - 2006-03-23 10:45:56
|
If I define function: * (defun get-folder-path (CSIDL) (with-alien ((apath (* char) (make-alien char (1+ MAX_PATH)))) (alien-funcall (extern-alien "SHGetFolderPathA" (function int sb-win32::handle int sb-win32::handle sb-win32::dword (* char))) 0 CSIDL 0 0 apath) (cast apath c-string))) GET-FOLDER-PATH * (GET-FOLDER-PATH 0) "C:\\Documents and Settings\\Kavenchuk_Yaroslav\\Рабочий стол" - all is work. Fine! But if I put this function in win32.lisp - I get error: ; compiling (DEFUN GET-FOLDER-PATH ...) ; file: C:\gnu\home\src\sbcl\sbcl\src\code\win32.lisp ; in: DEFUN GET-FOLDER-PATH ; (SB!ALIEN:CAST SB!WIN32::APATH SB!ALIEN:C-STRING) ; --> SB!ALIEN-INTERNALS:%CAST SB!ALIEN-INTERNALS:NATURALIZE IF ; ==> ; NIL ; ; caught WARNING: ; This is not a (VALUES STRING &REST T): ; NIL Function without initial value for local alien variable do not take error: (defun get-error-message (err) (with-alien ((amsg (* char))) (alien-funcall (extern-alien "FormatMessageA@28" (function dword dword dword dword dword (* (* char)) dword dword)) (logior FORMAT_MESSAGE_ALLOCATE_BUFFER FORMAT_MESSAGE_FROM_SYSTEM) 0 err 0 (addr amsg) 0 0) (prog1 (cast amsg c-string) (local-free amsg)))) Why? How it to correct? Or it only at me? Thanks! -- WBR, Yaroslav Kavenchuk. |
From: Yaroslav K. <kav...@je...> - 2006-03-23 12:25:14
|
> If I define function: > > * (defun get-folder-path (CSIDL) > (with-alien ((apath (* char) (make-alien char (1+ MAX_PATH)))) > (alien-funcall > (extern-alien "SHGetFolderPathA" > (function int sb-win32::handle int sb-win32::handle > sb-win32::dword (* char))) > 0 CSIDL 0 0 apath) > (cast apath c-string))) > > GET-FOLDER-PATH > * (GET-FOLDER-PATH 0) > > "C:\\Documents and Settings\\Kavenchuk_Yaroslav\\Рабочий стол" > > - all is work. Fine! But if I put this function in win32.lisp - I get > error: > > ; compiling (DEFUN GET-FOLDER-PATH ...) > ; file: C:\gnu\home\src\sbcl\sbcl\src\code\win32.lisp > ; in: DEFUN GET-FOLDER-PATH > ; (SB!ALIEN:CAST SB!WIN32::APATH SB!ALIEN:C-STRING) > ; --> SB!ALIEN-INTERNALS:%CAST SB!ALIEN-INTERNALS:NATURALIZE IF > ; ==> > ; NIL > ; > ; caught WARNING: > ; This is not a (VALUES STRING &REST T): > ; NIL Oops. If change last line in function from > (cast apath c-string))) to > (prog1 (cast apath c-string) (alien-free apath)))) all is work. What is it? Thanks! -- WBR, Yaroslav Kavenchuk. |