mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/Win32API/*: removed or moved to ext/dl/win32.
* ext/dl/win32/*: new. [ruby-dev:32387] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14093 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
6af5227ec0
commit
97a9e9da85
13 changed files with 40 additions and 251 deletions
|
@ -1,3 +1,9 @@
|
|||
Mon Dec 3 11:51:53 2007 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||
|
||||
* ext/Win32API/*: removed or moved to ext/dl/win32.
|
||||
|
||||
* ext/dl/win32/*: new. [ruby-dev:32387]
|
||||
|
||||
Sun Dec 2 22:08:01 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* parse.y (parser_tokadd_mbchar): fix for ASCII chars. [ruby-dev:32432]
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
Makefile
|
||||
*.log
|
||||
*.def
|
|
@ -1,215 +0,0 @@
|
|||
/*
|
||||
Win32API - Ruby Win32 API Import Facility
|
||||
*/
|
||||
|
||||
#if !defined _MSC_VER && !defined _WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#define _T_VOID 0
|
||||
#define _T_NUMBER 1
|
||||
#define _T_POINTER 2
|
||||
#define _T_INTEGER 3
|
||||
|
||||
#include "ruby.h"
|
||||
|
||||
typedef struct {
|
||||
HANDLE dll;
|
||||
HANDLE proc;
|
||||
VALUE dllname;
|
||||
VALUE import;
|
||||
VALUE export;
|
||||
} Win32API;
|
||||
|
||||
static void
|
||||
Win32API_FreeLibrary(hdll)
|
||||
HINSTANCE hdll;
|
||||
{
|
||||
FreeLibrary(hdll);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
Win32API_initialize(self, dllname, proc, import, export)
|
||||
VALUE self;
|
||||
VALUE dllname;
|
||||
VALUE proc;
|
||||
VALUE import;
|
||||
VALUE export;
|
||||
{
|
||||
HANDLE hproc;
|
||||
HINSTANCE hdll;
|
||||
VALUE str;
|
||||
VALUE a_import;
|
||||
VALUE *ptr;
|
||||
char *s;
|
||||
int i;
|
||||
int len;
|
||||
int ex = _T_VOID;
|
||||
|
||||
SafeStringValue(dllname);
|
||||
SafeStringValue(proc);
|
||||
hdll = LoadLibrary(RSTRING_PTR(dllname));
|
||||
if (!hdll)
|
||||
rb_raise(rb_eRuntimeError, "LoadLibrary: %s\n", RSTRING_PTR(dllname));
|
||||
rb_iv_set(self, "__hdll__", Data_Wrap_Struct(rb_cData, 0, Win32API_FreeLibrary, (void*)hdll));
|
||||
hproc = (HANDLE)GetProcAddress(hdll, RSTRING_PTR(proc));
|
||||
if (!hproc) {
|
||||
str = rb_str_new3(proc);
|
||||
str = rb_str_cat(str, "A", 1);
|
||||
hproc = (HANDLE)GetProcAddress(hdll, RSTRING_PTR(str));
|
||||
if (!hproc)
|
||||
rb_raise(rb_eRuntimeError, "GetProcAddress: %s or %s\n",
|
||||
RSTRING_PTR(proc), RSTRING_PTR(str));
|
||||
}
|
||||
rb_iv_set(self, "__dll__", UINT2NUM((unsigned long)hdll));
|
||||
rb_iv_set(self, "__dllname__", dllname);
|
||||
rb_iv_set(self, "__proc__", UINT2NUM((unsigned long)hproc));
|
||||
|
||||
a_import = rb_ary_new();
|
||||
switch (TYPE(import)) {
|
||||
case T_NIL:
|
||||
break;
|
||||
case T_ARRAY:
|
||||
ptr = RARRAY_PTR(import);
|
||||
for (i = 0, len = RARRAY_LEN(import); i < len; i++) {
|
||||
SafeStringValue(ptr[i]);
|
||||
switch (*(char *)RSTRING_PTR(ptr[i])) {
|
||||
case 'N': case 'n': case 'L': case 'l':
|
||||
rb_ary_push(a_import, INT2FIX(_T_NUMBER));
|
||||
break;
|
||||
case 'P': case 'p':
|
||||
rb_ary_push(a_import, INT2FIX(_T_POINTER));
|
||||
break;
|
||||
case 'I': case 'i':
|
||||
rb_ary_push(a_import, INT2FIX(_T_INTEGER));
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
SafeStringValue(import);
|
||||
s = RSTRING_PTR(import);
|
||||
for (i = 0, len = RSTRING_LEN(import); i < len; i++) {
|
||||
switch (*s++) {
|
||||
case 'N': case 'n': case 'L': case 'l':
|
||||
rb_ary_push(a_import, INT2FIX(_T_NUMBER));
|
||||
break;
|
||||
case 'P': case 'p':
|
||||
rb_ary_push(a_import, INT2FIX(_T_POINTER));
|
||||
break;
|
||||
case 'I': case 'i':
|
||||
rb_ary_push(a_import, INT2FIX(_T_INTEGER));
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (16 < RARRAY_LEN(a_import)) {
|
||||
rb_raise(rb_eRuntimeError, "too many parameters: %ld\n", RARRAY_LEN(a_import));
|
||||
}
|
||||
|
||||
rb_iv_set(self, "__import__", a_import);
|
||||
|
||||
if (NIL_P(export)) {
|
||||
ex = _T_VOID;
|
||||
} else {
|
||||
SafeStringValue(export);
|
||||
switch (*RSTRING_PTR(export)) {
|
||||
case 'V': case 'v':
|
||||
ex = _T_VOID;
|
||||
break;
|
||||
case 'N': case 'n': case 'L': case 'l':
|
||||
ex = _T_NUMBER;
|
||||
break;
|
||||
case 'P': case 'p':
|
||||
ex = _T_POINTER;
|
||||
break;
|
||||
case 'I': case 'i':
|
||||
ex = _T_INTEGER;
|
||||
break;
|
||||
}
|
||||
}
|
||||
rb_iv_set(self, "__export__", INT2FIX(ex));
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma optimize("g", off)
|
||||
#endif
|
||||
static VALUE
|
||||
Win32API_Call(argc, argv, obj)
|
||||
int argc;
|
||||
VALUE *argv;
|
||||
VALUE obj;
|
||||
{
|
||||
VALUE args;
|
||||
unsigned long ret;
|
||||
int i;
|
||||
struct {
|
||||
unsigned long params[16];
|
||||
} param;
|
||||
#define params param.params
|
||||
|
||||
VALUE obj_proc = rb_iv_get(obj, "__proc__");
|
||||
VALUE obj_import = rb_iv_get(obj, "__import__");
|
||||
VALUE obj_export = rb_iv_get(obj, "__export__");
|
||||
FARPROC ApiFunction = (FARPROC)NUM2ULONG(obj_proc);
|
||||
int items = rb_scan_args(argc, argv, "0*", &args);
|
||||
int nimport = RARRAY_LEN(obj_import);
|
||||
|
||||
|
||||
if (items != nimport)
|
||||
rb_raise(rb_eRuntimeError, "wrong number of parameters: expected %d, got %d",
|
||||
nimport, items);
|
||||
|
||||
for (i = 0; i < nimport; i++) {
|
||||
unsigned long lParam = 0;
|
||||
switch (FIX2INT(rb_ary_entry(obj_import, i))) {
|
||||
VALUE str;
|
||||
case _T_NUMBER:
|
||||
case _T_INTEGER:
|
||||
default:
|
||||
lParam = NUM2ULONG(rb_ary_entry(args, i));
|
||||
break;
|
||||
case _T_POINTER:
|
||||
str = rb_ary_entry(args, i);
|
||||
if (NIL_P(str)) {
|
||||
lParam = 0;
|
||||
} else if (FIXNUM_P(str)) {
|
||||
lParam = NUM2ULONG(str);
|
||||
} else {
|
||||
StringValue(str);
|
||||
rb_str_modify(str);
|
||||
lParam = (unsigned long)StringValuePtr(str);
|
||||
}
|
||||
break;
|
||||
}
|
||||
params[i] = lParam;
|
||||
}
|
||||
|
||||
ret = ApiFunction(param);
|
||||
|
||||
switch (FIX2INT(obj_export)) {
|
||||
case _T_NUMBER:
|
||||
case _T_INTEGER:
|
||||
return INT2NUM(ret);
|
||||
case _T_POINTER:
|
||||
return rb_str_new2((char *)ret);
|
||||
case _T_VOID:
|
||||
default:
|
||||
return INT2NUM(0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Init_Win32API()
|
||||
{
|
||||
VALUE cWin32API = rb_define_class("Win32API", rb_cObject);
|
||||
rb_define_method(cWin32API, "initialize", Win32API_initialize, 4);
|
||||
rb_define_method(cWin32API, "call", Win32API_Call, -1);
|
||||
rb_define_alias(cWin32API, "Call", "call");
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
Win32API.o : Win32API.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h
|
|
@ -1,6 +0,0 @@
|
|||
require 'mkmf'
|
||||
|
||||
dir_config("win32")
|
||||
if have_header("windows.h") and have_library("kernel32")
|
||||
create_makefile("Win32API")
|
||||
end
|
|
@ -1,5 +0,0 @@
|
|||
require 'Win32API'
|
||||
|
||||
getch = Win32API.new("crtdll", "_getch", [], 'L')
|
||||
|
||||
puts getch.Call.chr
|
|
@ -1,18 +0,0 @@
|
|||
require 'Win32API'
|
||||
|
||||
getCursorPos = Win32API.new("user32", "GetCursorPos", ['P'], 'V')
|
||||
|
||||
lpPoint = " " * 8 # store two LONGs
|
||||
getCursorPos.Call(lpPoint)
|
||||
x, y = lpPoint.unpack("LL") # get the actual values
|
||||
|
||||
print "x: ", x, "\n"
|
||||
print "y: ", y, "\n"
|
||||
|
||||
ods = Win32API.new("kernel32", "OutputDebugString", ['P'], 'V')
|
||||
ods.Call("Hello, World\n");
|
||||
|
||||
GetDesktopWindow = Win32API.new("user32", "GetDesktopWindow", [], 'L')
|
||||
GetActiveWindow = Win32API.new("user32", "GetActiveWindow", [], 'L')
|
||||
SendMessage = Win32API.new("user32", "SendMessage", ['L'] * 4, 'L')
|
||||
SendMessage.Call GetDesktopWindow.Call, 274, 0xf140, 0
|
3
ext/dl/win32/extconf.rb
Normal file
3
ext/dl/win32/extconf.rb
Normal file
|
@ -0,0 +1,3 @@
|
|||
if compiled?('dl') and $mswin||$bccwin||$mingw||$cygwin
|
||||
create_makefile('win32')
|
||||
end
|
28
ext/dl/win32/lib/Win32API.rb
Normal file
28
ext/dl/win32/lib/Win32API.rb
Normal file
|
@ -0,0 +1,28 @@
|
|||
# -*- ruby -*-
|
||||
# for backward compatibility
|
||||
warn "Warning:#{caller[0].sub(/:in `.*'\z/, '')}: Win32API is deprecated after Ruby 1.9.1; use dl directly instead" if $VERBOSE
|
||||
|
||||
require 'dl'
|
||||
|
||||
class Win32API
|
||||
DLL = {}
|
||||
TYPEMAP = {"0" => DL::TYPE_VOID, "S" => DL::TYPE_VOIDP, "I" => DL::TYPE_LONG}
|
||||
|
||||
def initialize(dllname, func, import, export = "0")
|
||||
@proto = [import].join.tr("VPpNnLlIi", "0SSI").sub(/^(.)0*$/, '\1')
|
||||
handle = DLL[dllname] ||= DL.dlopen(dllname)
|
||||
@func = DL::CFunc.new(handle[func], TYPEMAP[export.tr("VPpNnLlIi", "0SSI")], func)
|
||||
end
|
||||
|
||||
def call(*args)
|
||||
import = @proto.split("")
|
||||
args.each_with_index do |x, i|
|
||||
args[i], = [x == 0 ? nil : x].pack("p").unpack("l!*") if import[i] == "S"
|
||||
args[i], = [x].pack("I").unpack("i") if import[i] == "I"
|
||||
end
|
||||
ret, = @func.call(args)
|
||||
return ret || 0
|
||||
end
|
||||
|
||||
alias Call call
|
||||
end
|
|
@ -1,7 +1,7 @@
|
|||
#define RUBY_VERSION "1.9.0"
|
||||
#define RUBY_RELEASE_DATE "2007-12-02"
|
||||
#define RUBY_RELEASE_DATE "2007-12-03"
|
||||
#define RUBY_VERSION_CODE 190
|
||||
#define RUBY_RELEASE_CODE 20071202
|
||||
#define RUBY_RELEASE_CODE 20071203
|
||||
#define RUBY_PATCHLEVEL 0
|
||||
|
||||
#define RUBY_VERSION_MAJOR 1
|
||||
|
@ -9,7 +9,7 @@
|
|||
#define RUBY_VERSION_TEENY 0
|
||||
#define RUBY_RELEASE_YEAR 2007
|
||||
#define RUBY_RELEASE_MONTH 12
|
||||
#define RUBY_RELEASE_DAY 2
|
||||
#define RUBY_RELEASE_DAY 3
|
||||
|
||||
#ifdef RUBY_EXTERN
|
||||
RUBY_EXTERN const char ruby_version[];
|
||||
|
|
Loading…
Add table
Reference in a new issue