|
[code]#===============================================================# Vx ace Fiddle##===============================================================module Fiddle TYPE_VOID = DL::TYPE_VOID TYPE_INT = DL::TYPE_INT TYPE_LONG = DL::TYPE_LONG TYPE_VOIDP = DL::TYPE_VOIDP TYPE_FLOAT = DL::TYPE_FLOAT TYPE_DOUBLE = DL::TYPE_DOUBLE TYPE_CHAR = DL::TYPE_CHAR TYPE_SHORT = DL::TYPE_SHORT TYPE_UCHAR = -TYPE_CHAR TYPE_USHORT = -TYPE_SHORT TYPE_UINT = -TYPE_INT TYPE_ULONG = -TYPE_LONG #调用约定 DEFAULT = :stdcall #========== 函数封装 ========== class Function def initialize(ptr, args, ret, abi = DEFAULT) @ptr = ptr @args = args @ret = ret @calltype = case abi when :stdcall, :STDCALL, 1 then :stdcall when :cdecl, :CDECL, 0 then :cdecl else :stdcall end @cfunc = DL::CFunc.new(ptr, ret, 'fiddle_func', @calltype) end def call(*args) temp_ptrs = [] converted = args.zip(@args).map do |val, type| if type == TYPE_VOIDP if val.nil? 0 elsif val.is_a?(String) #转为 UTF-16LE(Unicode) utf16 = val.encode("UTF-16LE") + "\0\0".encode("UTF-16LE") bin = utf16.force_encoding("ASCII-8BIT") ptr = DL::CPtr[bin] temp_ptrs |