summaryrefslogtreecommitdiff
path: root/ruby_1_8_5/ext/dl/lib/dl/win32.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ruby_1_8_5/ext/dl/lib/dl/win32.rb')
-rw-r--r--ruby_1_8_5/ext/dl/lib/dl/win32.rb25
1 files changed, 25 insertions, 0 deletions
diff --git a/ruby_1_8_5/ext/dl/lib/dl/win32.rb b/ruby_1_8_5/ext/dl/lib/dl/win32.rb
new file mode 100644
index 0000000000..0fed47c324
--- /dev/null
+++ b/ruby_1_8_5/ext/dl/lib/dl/win32.rb
@@ -0,0 +1,25 @@
+# -*- ruby -*-
+
+require 'dl'
+
+class Win32API
+ DLL = {}
+
+ def initialize(dllname, func, import, export = "0")
+ prototype = (export + import.to_s).tr("VPpNnLlIi", "0SSI").sub(/^(.)0*$/, '\1')
+ handle = DLL[dllname] ||= DL::Handle.new(dllname)
+ @sym = handle.sym(func, prototype)
+ end
+
+ def call(*args)
+ import = @sym.proto.split("", 2)[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