From 3074716cadfffd28432f5bb6a6eef4762555efb8 Mon Sep 17 00:00:00 2001 From: eban Date: Sat, 11 Jan 2003 15:00:56 +0000 Subject: * ext/dl/lib/dl/win32.rb: compatibility improvement. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3330 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/dl/lib/dl/win32.rb | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'ext') diff --git a/ext/dl/lib/dl/win32.rb b/ext/dl/lib/dl/win32.rb index b507be5fde..f0ea2a91e1 100644 --- a/ext/dl/lib/dl/win32.rb +++ b/ext/dl/lib/dl/win32.rb @@ -3,24 +3,27 @@ require 'dl' class Win32API - LIBRARY = {} + DLL = {} - attr_reader :val, :args - - def initialize(lib, func, args, ret) - LIBRARY[lib] ||= DL.dlopen(lib) - ty = (ret + args).tr('V','0') - @sym = LIBRARY[lib].sym(func, ty) - @__dll__ = LIBRARY[lib].to_i - @__dllname__ = lib - @__proc__ = @sym.to_i - @val = nil - @args = [] + def initialize(dllname, func, import, export = "0") + prototype = (export + import.to_s).tr("VPpNnLlIi", "0SSI") + handle = DLL[dllname] ||= DL::Handle.new(dllname) + begin + @sym = handle.sym(func, prototype) + rescue RuntimeError + @sym = handle.sym(func + "A", prototype) + end end def call(*args) - @val,@args = @sym.call(*args) - return @val + import = @sym.proto[1..-1] || "" + args.each_with_index do |x, i| + args[i] = nil if x == 0 and import[i] == ?S + args[i], = [x].pack("I").unpack("i") if import[i] == ?I + end + ret, = @sym.call(*args) + return ret || 0 end + alias Call call end -- cgit v1.2.3