[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:08728] Re: address 参照の解決について



 こんばんは。あべです。



>>  多分 unpack-string を使えば良いのではないかと思います。
>> |   (format t "~S~%" (si::unpack-string lpelfe OFFSET))
>> てな感じでいけると思います。
>>  OFFSET は構造体(ENUMLOGFONTEX)での efFaceName の相対アドレスです。
> それももしかしたらと思って試していたのですが、lpelfe が単なるアドレスで
> chunk でないため、si::unpack-string に「型が違う」と怒られてしまいます。

 嘘ばっかりですみません。僕が書いたプログラムでは自前で make-chunk して
いたので気付きませんでした。



> うまい方法があるような気がするのですが、頭が固いためいかんとも
> できてません。

 全然うまくないのですが kernel32.dll にある RtlMoveMemory を呼び出して
| (in-package "foreign")
| (define-dll-entry void memmove ((void *) (void *) u_int) "kernel32" "RtlMoveMemory")
| (defun name-of (lpelfe)
|   (declare (type integer lpelfe))
|   (let ((chunk (make-chunk 'void 128)))
|     (memmove (address-of chunk) (+ lpelfe OFFSET) 128))
|     (si::unpack-string chunk 0)))
とすればいけるんじゃないかと思います。



>> # もしかして "~S~%" は "~A~%" じゃないですか。どーでも良いところですけど。
> 
> お試しコードを printf デバッグするときは、型が違うと怒られるとやるせなく
> なってくるので (format t "~S" ...) で出力しています。

 なるほど。確かにデバッグ段階では巣のままのデータを表示してくれた方が
ありがたいですね。そう云えば Ruby で print デバッグをしていて泣きそうに
なった経験があります。



-----------------------------------
阿部 洋志 <hiro-abe@xxxxxxxxxxxxxxxxxx>
    -----------------------------------

Index Home