class Reline::Windows::Win32API - Documentation for Ruby 3.4
Description: Documentation for the Reline::Windows::Win32API class
Keywords: ruby,class,Reline::Windows::Win32API

# class Reline::Windows::Win32API

### Constants

DLL
DL_TYPES
POINTER_TYPE
TYPEMAP
WIN32_TYPES

### Public Class Methods

new (dllname, func, import, export = "0", calltype = :stdcall)
Source

    # File lib/reline/io/windows.rb, line 98
    def initialize(dllname, func, import, export = "0", calltype = :stdcall)
      @proto = [import].join.tr(WIN32_TYPES, DL_TYPES).sub(/^(.)0*$/, '\1')
      import = @proto.chars.map {|win_type| TYPEMAP[win_type.tr(WIN32_TYPES, DL_TYPES)]}
      export = TYPEMAP[export.tr(WIN32_TYPES, DL_TYPES)]
      calltype = Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[calltype]

      handle = DLL[dllname] ||=
               begin
                 Fiddle.dlopen(dllname)
               rescue Fiddle::DLError
                 raise unless File.extname(dllname).empty?
                 Fiddle.dlopen(dllname + ".dll")
               end

      @func = Fiddle::Function.new(handle[func], import, export, calltype)
    rescue Fiddle::DLError => e
      raise LoadError, e.message, e.backtrace
    end

### Public Instance Methods

call (*args)
Source

    # File lib/reline/io/windows.rb, line 117
    def call(*args)
      import = @proto.split("")
      args.each_with_index do |x, i|
        args[i], = [x == 0 ? nil : +x].pack("p").unpack(POINTER_TYPE) if import[i] == "S"
        args[i], = [x].pack("I").unpack("i") if import[i] == "I"
      end
      ret, = @func.call(*args)
      return ret || 0
    end