summaryrefslogtreecommitdiff
path: root/ext/dl/lib/dl/win32.rb
blob: f0ea2a91e12a438988835d6111de9f33b9845571 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- ruby -*-

require 'dl'

class Win32API
  DLL = {}

  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)
    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