[xyzzy:08728] Re: address 参照の解決について
- Subject: [xyzzy:08728] Re: address 参照の解決について
- From: ABE Hiroshi <hiro-abe@xxxxxxxxxxxxxxxxxx>
- X-mailer: KaMail-0.0.2.5[02/02/24] on xyzzy-0.2.2.233 (whistler)
- X-yzzy-version: 0.2.2.233
こんばんは。あべです。
>> 多分 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>
-----------------------------------