More complete example: http://pasterack.org/pastes/25901
I guess I've found reason of the problem. I think the problem was in that line: (define lpdwItems (make-bytes (ctype-sizeof _pointer) 0)) I've changed it to: (define lpdwItems (make-bytes (ctype-sizeof _DWORD) 0)) There is no visible problems now, but I doubt that applying `make-bytes' here is right. Should I use `malloc' in such cases? Anyway, sorry for the noise. > My best guess is that it's an issue with memory management, because > memory management gets a lot trickier when you call a function that can > call back into Racket. A GC can happen during the callback, and > therefore during the dynamic extent of the foreign-function call, which > can move arguments that were passed to the foreign function, for example. > > Would it be possible to provide a complete example? > > At Sat, 13 Sep 2014 22:45:28 +0700 (NOVT), "Evgeny Odegov" wrote: >> Oh, I'm wrong. The last code is not equivalent to initial. >> The equivalent code has this problem: >> >> (define result (make-hash)) >> (define big-list (list)) >> (define (callback dwTextID lpszInfoText lpvUser) >> (if (equal? lpszInfoText "") >> (set! big-list (append big-list (list dwTextID))) >> (hash-update! result >> lpszInfoText >> (lambda (id-lst) >> (define v (list dwTextID)) >> (append id-lst v)) >> '())) >> #t) >> >> >> The code with `cons' instead `append' works fine: >> >> (define result (make-hash)) >> (define (callback dwTextID lpszInfoText lpvUser) >> (hash-update! result >> lpszInfoText >> (lambda (id-lst) >> (define new-id-lst (cons dwTextID id-lst)) >> (unless (list? new-id-lst) >> >> (error "~v" new-id-lst)) >> new-id-lst) >> '()) >> #t) >> >> >> >> >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users > ____________________ Racket Users list: http://lists.racket-lang.org/users