[#41876] mswin32版のライセンスについて — TOBY <toby@...>

はじめまして、rubyを愛してやまないTOBYと申します。

13 messages 2006/03/05

[#41886] "win32/registry" と "dl/win32" の相性について — take_tk <ggb03124@...>

たけ(tk)です

14 messages 2006/03/07
[#41887] Re: "win32/registry" と "dl/win32" の相性について — nobu@... 2006/03/07

なかだです。

[#41888] Re: "win32/registry" と "dl/win32" の相性について — take_tk <ggb03124@...> 2006/03/07

たけ(tk)です

[#41933] Cygwin での #!/bin/env ruby -Ks — "Hideo Konami" <konami@...>

小波です。Cygwin で Ruby のスクリプトをいつも書いています。

14 messages 2006/03/22

[ruby-list:41907] Re: "win32/registry" と "dl/win32" の相性について

From: Takaaki Tateishi <ttate@...>
Date: 2006-03-12 06:09:37 UTC
List: ruby-list #41907
take_tk wrote:
>>> "dl/win32" の Win32API を前提とするメソッドで、
>>> no implicit conversion from nil to integer (TypeError)
...
> これは、dl/win32 の Win32API にたいする互換性の問題で、おそらくは、
> Integerを期待しているメソッドに対してnilを送ったときの動作の非互換性の問
> 題。

問題点がよく分からないので少し確認したいのですが、まず、この "no implicit
conversion from nil to integer (TypeError)" のエラーは、Win32API.soにおける
エラーです。試しに、次のプログラムを動作させてみました。
このプログラムでは、先のmessage_boxメソッドにnilを第一引数に与えています。

require "Win32API"
MessageBox = Win32API.new( 'user32' , 'MessageBox' , %w(N P P N) , "N" )
def message_box( handle,text,caption,type=0 )
  MessageBox.call( handle , text , caption ,type )
end
message_box( nil, "hello" , "" , 0 )

エラーメッセージは次の通りです。

t2.rb:5:in `call': no implicit conversion from nil to integer (TypeError)
        from t2.rb:5:in `message_box'
        from t2.rb:7

次に、dl/win32を使った場合には、次のようなエラーがでます。

/usr/local/lib/ruby/1.8/dl/win32.rb:18:in `pack': can't convert nil into Integer (TypeError)
        from /usr/local/lib/ruby/1.8/dl/win32.rb:18:in `call'
        from t2.rb:1:in `each_with_index'
        from /usr/local/lib/ruby/1.8/dl/win32.rb:16:in `call'
        from t2.rb:5:in `message_box'
        from t2.rb:7

これらのことを考慮した上で、次の(a),(b)について考えます。

> (a)dl/win32 で、この非互換性が生じている部分を見つけて Win32API 互換
> になるように変更するか、

すでにnil->0の自動変換はdl/win32,Win32APIともに行われず、エラーになるということは確認
できたわけですが、全く同じエラーを出るようにすべきだという意見はあるかと思います。

> (b)win32/registory を訂正する、

当初の問題は、値の自動変換による互換性ではなく、[ruby-list:41886]にあるようにdl/win32.rb
とWin32API.soを*併用*したときの問題だと思います。
そうであれば、registoryを修正するのではなく、(1)併用しても大丈夫なようにdl/win32を修正す
る方法と、(2)併用できないようにする方法があります。絶対に併用しなければならない状況という
ものもないような気がするので、比較的簡単に対処ができる(2)の方が良いと思います。
(2)の場合、変更すべきはdl/win32において、require 'dl/win32'を行ったら$LOADED_FEATURES
にWin32API.soを加えたり、あるいは、先にWin32API.soがロードされていたら警告を出すという
方法などで対処できるでしょうし、そうすべきだったとは思います。
-- 
Takaaki Tateishi <ttate@ttsky.net>

In This Thread