Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...
_ HEADのいわゆるtest-allでread buffer data lostの警告がまだ出るというのは別にWindowsに限った話じゃないはず(まじめに調べてないから確証はないけど)。
どうせ[ruby-dev:24141]という話になるようなので放置。
_ ungetcを2回読んじゃいけないのは当たり前なのでこれも放置したいなあ。本当にまじめに対策するならこれもstdioを捨てないといけないって話題に繋がります。
かとんぼさんとこのfseek()による対策は、(SEEK_CURじゃないとまずいよ、というのは別として、)seek不能なデバイスが相手のときに結局問題が発生すると思われます。
_ で、HEADでtest-all実行すると途中でなんかブロックしちゃうようわーん。
→ IO#read_partialじゃん。既知だからいいや(いいのか?)
_ とあるWin32 APIを使ってみる実験コードを書いたのですが、Cで書くのがめんどくさかったなどの理由でRubyを使いました。
で、Win32APIを使うのもなんなので、dl/win32を使ってみたところ、偉い人に「(dl/win32じゃなくて)dlだけで」と言われました。なるほど。
というわけで、使ってみたのですが、使い方がわかんないよう。
_ しばらく悪戦苦闘した結果、文字列以外をポインタとして渡して結果が欲しい場合はDL::PtrDataオブジェクトを生成する必要があることがわかりました。つまり、
module Win32Test require 'dl/import' extend DL::Importable dlload 'advapi32' extern 'long RegOpenKeyEx(HANDLE, LPCSTR, DWORD, DWORD, PHANDLE)' HKEY_CURRENT_USER = 0x80000001 KEY_READ = 0x00020019 ptr = DL.malloc(DL.sizeof('L')) ret = regOpenKeyEx(HKEY_CURRENT_USER, 'Software', 0, KEY_READ, ptr) key = ptr.to_a('L')[0] ptr.free # (ry end
てな感じになるよーです。なるほど。
しかし、せっかくexternにはHANDLEとか書けるのに、なんでDL.sizeofにはそう書けないんだ、とか思うわけで。
_ DL.sizeofには複数の型を与えることができるわけですが、その機能はDL::Importable::Structクラスがあるからなくてもいいような気がします。
また、もしDL::PtrDataクラスが元の(ポインタの指している先の)型を知っていれば、to_aあるいはto_sというメソッドを使わずにいきなり値を取ることもできるはずです。
というわけで、DL.alloc(型名, 数=1)とDL::PtrData#valueというメソッドを導入して、
# 上記の例を一部書き換えると... ptr = DL.alloc('HANDLE') ret = regOpenKeyEx(HKEY_CURRENT_USER, 'Software', 0, KEY_READ, ptr) key = ptr.value #...
被捕捉アンテナ類
[\ay antenna (testing)]
[Ant]
[Antenna-Julia]
[LayserあんてなV2]
[nAntenna]
[nuance de Antenna]
[Rabbit's Antenna]
[Read List]
[Ruby hotlinks 五月雨版 (るるりん。)]
[してたま (私的アンテナ with たまてばこ)]
[ただのあんてな]
[ちゃらんぽらん]
[でこぽんリンク]
[なよろアンテナ]
[にっきトレーサー]
[偽善者あんてな - 2nd season -]
[湘南日記放送局(SDB)]
[はてなの各アンテナ]