丁稚な日々

Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...

[直前] [最新] [直後] [Top]

Aug.23,2004 (Mon)

Revision: 1.2 (Aug.23,2004 09:50)

[mswin32] バグっぽいのいくつか

_ HEADのいわゆるtest-allでread buffer data lostの警告がまだ出るというのは別にWindowsに限った話じゃないはず(まじめに調べてないから確証はないけど)。
どうせ[ruby-dev:24141]という話になるようなので放置。

_ ungetcを2回読んじゃいけないのは当たり前なのでこれも放置したいなあ。本当にまじめに対策するならこれもstdioを捨てないといけないって話題に繋がります。
かとんぼさんとこfseek()による対策は、(SEEK_CURじゃないとまずいよ、というのは別として、)seek不能なデバイスが相手のときに結局問題が発生すると思われます。

_ で、HEADでtest-all実行すると途中でなんかブロックしちゃうようわーん。
IO#read_partialじゃん。既知だからいいや(いいのか?)

Aug.27,2004 (Fri)

Revision: 1.6 (Aug.27,2004 14:47)

dl

_ とある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)] [はてなの各アンテナ]