1
0
Fork 0
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:
usa 2007-12-03 02:53:13 +00:00
parent 6af5227ec0
commit 97a9e9da85
13 changed files with 40 additions and 251 deletions

View file

@ -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]

View file

@ -1,3 +0,0 @@
Makefile
*.log
*.def

View file

@ -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");
}

View file

@ -1 +0,0 @@
Win32API.o : Win32API.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h

View file

@ -1,6 +0,0 @@
require 'mkmf'
dir_config("win32")
if have_header("windows.h") and have_library("kernel32")
create_makefile("Win32API")
end

View file

@ -1,5 +0,0 @@
require 'Win32API'
getch = Win32API.new("crtdll", "_getch", [], 'L')
puts getch.Call.chr

View file

@ -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
View file

@ -0,0 +1,3 @@
if compiled?('dl') and $mswin||$bccwin||$mingw||$cygwin
create_makefile('win32')
end

View 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

View file

@ -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[];