----Next_Part(Wed_Feb_16_00:39:08_2000_41)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

皆さん今晩は、田鎖です。

Win95 上の Ruby (Ruby本に付いたもの) で GPIB コントロールをしたいと思い、
NI GPIB カード用の ライブラリをい燭里任垢;打 が始まるとエラーを起こ
してしまいます。Windows のプログラムに関しては、よく分かっていないのでつ
ぼを外しているかもしれませんが、プログラムの中で使われている
gpib-32.dll の大域変数が GC が始まったとたん捨てられる様なのです。

このように、Ruby と相性の悪い dll をうまく手なずける方法はありませんでしょ
うか。( cygwin 版ではなく mswin 版なら解決する可あり? )

最後に、スをつけておきますので、お手元に環境のある方はお試しください。
GC が動作するまではなりに動作します。

非常にマイナーな話題でわけありませんが、よろしくお願いします。


							'00.2.15 tag


----Next_Part(Wed_Feb_16_00:39:08_2000_41)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=wingpib.rb

#!/usr/local/bin/ruby

#
# NI Gpib library wrapper
#

require "Win32API"

def Gpib(name  ")
  dev  pib.new
  dev.ibfind(name) if name ! "
  dev
end

class Gpib

  class Error < StandardError
  end

  def initialize
    @dev  1
    @buf  \0" * 30000
  end

  def write(str)
    stat  bwrt(str)
    if (stat & 0b1000000000000000) > 0
      raise Gpib::Error, error_to_str(stat)
    end
  end

  def read
    buf  "
    loop do
      stat,b  brd
      if (stat & 0b1000000000000000) > 0
	raise Gpib::Error, error_to_str(stat)
      end
      buf << b
      if (stat & 0b0010000000000000) > 0 # END bit
	return buf
      end
    end
  end

  def rsp
    stat, rsp  brsp
    if (stat & 0b1000000000000000) > 0
      raise Gpib::Error, error_to_str(stat)
    end
    rsp
  end
#
#
#
  def error_to_str(stat)
    r  ]
    err_stat  format "%016b",stat).split(//)
    err_str  "ERR","TMO","END","RQS","SRQI",nil,nil,"CMPL","LOK","REN","CIC","ATN","TACS","LACS","DTAS","DCAS"]

    while err_stat ! ]
      if err_stat.shift "1"
	r << err_str.shift
      else
	err_str.shift
      end
    end
    "<" + r.join(",") + ">"
  end

  def ibfind(name  dev1")
    func  in32API.new("gpib-32","ibfind",["P"],"L")
    @dev  unc.call(name)
  end

  def ibwrt(str)
    func  in32API.new("gpib-32","ibwrt",["L","P","L"],"L")
    func.call(@dev,str,str.size)
  end

  def ibrd
    func  in32API.new("gpib-32","ibrd",["L","P","L"],"L")
    stat  unc.call(@dev,@buf,@buf.size)
    cnt  hredibcntl
    [stat,@buf[0,cnt]]
  end

  def thredibcntl
    func  in32API.new("gpib-32","ThreadIbcntl",[],"L")
    func.call
  end

  def thrediberr
    func  in32API.new("gpib-32","ThreadIberr",[],"L")
    func.call
  end

  def ibrsp
    rsp  \0"
    func  in32API.new("gpib-32","ibrsp",["L","P"],"L")
    stat  unc.call(@dev,rsp)
    [stat, rsp.unpack("c")[0]]
  end

  def ibpad(pad)
    func  in32API.new("gpib-32","ibpad",["L","L"],"L")
    func.call(@dev,pad)
  end

  def ibsad(sad)
    func  in32API.new("gpib-32","ibsad",["L","L"],"L")
    func.call(@dev,sad)
  end

  def ibtmo(tmo)
    func  in32API.new("gpib-32","ibtmo",["L","L"],"L")
    func.call(@dev,tmo)
  end

end

if __FILE__ $0
  dev  pib("dev1")
  dev.write("*idn?") ; print dev.read
  STDOUT.flush
end

----Next_Part(Wed_Feb_16_00:39:08_2000_41)----