[racket] ffi->SendMessageTimeoutW
Hello friends,
I try to access SendMessageTimeout throgh ffi.
I write:
[CODE_BEGIN]
#lang racket
(require ffi/com
         ffi/unsafe
         ffi/unsafe/define
         ffi/winapi
         racket/string
         racket/format)
(define _HKEY 	(_cpointer/null 'HKEY))
(define _HANDLE (_cpointer/null 'HANDLE))
(define _HWND 	(_cpointer/null 'HWND))
(define _HINSTANCE (_cpointer/null 'HINSTANCE))
(define _LONG       _long)
(define _WORD       _int16)
(define _DWORD      _int32)
(define _REGSAM     _DWORD)
(define _LONG_PTR   _intptr)
(define _LPARAM     _LONG_PTR)
(define _LRESULT    _LONG_PTR)
(define _HRESULT    _LONG)
(define _WPARAM     _intptr)
(define _UINT       _uint)
(define _BOOL       (make-ctype _int (lambda (v) (if v 1 0)) (lambda (v) (not (zero? v)))))
(define SMTO_ABORTIFHUNG        #x0002)
(define SMTO_BLOCK              #x0001)
(define SMTO_NORMAL             #x0000)
(define SMTO_NOTIMEOUTIFNOTHUNG #x0008)
(define SMTO_ERRORONEXIT        #x0020)
(define HWND_BROADCAST (cast #xffff _intptr _HWND))
(define WM_WININICHANGE         #x001A)
(define WM_SETTINGCHANGE        WM_WININICHANGE)
(define kernel-dll (and (eq? (system-type) 'windows)
                        (ffi-lib "Kernel32.dll")))
(define user32-dll (and (eq? (system-type) 'windows)
                        (ffi-lib "User32.dll")))
(define-ffi-definer define-kernel kernel-dll
  #:default-make-fail make-not-available)
(define-ffi-definer define-user32 user32-dll
  #:default-make-fail make-not-available)
(define-kernel GetLastError (_fun #:abi winapi
                                  -> (r : _DWORD)))
(define-user32 SendMessageTimeoutW (_fun #:abi winapi
                                      _HWND
                                      _UINT
                                      _WPARAM
                                      _LPARAM
                                      _UINT
                                      _UINT
                                      (lpdwResult : (_ptr o _DWORD))
                                      -> (r : _long)
                                      -> (values r lpdwResult )))
(define ENV (cast "Environment" _string/utf-16 _intptr))
[CODE_END]
In C++ I make this:
DWORD dwResult = 0;
LRESULT Return = 0;
Return = ::SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment"), SMTO_ABORTIFHUNG, 5000, &dwResult);
DWORD err = ::GetLastError();
Here I get 0 in err (Return =0 and dwResult = 1);
But in Racket when I call the function:
(define-values ( r4 res4) (SendMessageTimeoutW HWND_BROADCAST
                                               WM_SETTINGCHANGE
                                               0
                                               ENV
                                               SMTO_ABORTIFHUNG
                                               5000))
I get r4= 1 and res4=0
But (GetLastError) gives 3 and this means ERROR_PATH_NOT_FOUND.
Which path is here mentioned?
Is the ffi define correct, especially the way I define ENV gives me a headache?
Yours,