Можно много говорить о возможностях языка, о его красоте, но ни что не дает такого удовлетворения как расширяемость своими руками. Хотите расширить функционал ruby или ускорить часть реализованного кода? Тогда стандартная библиотека fiddle для Вас. Подключаем, описываем API функции заложенные в dll файлах и пользуемся. Сделав красивую обертку с наслаждением используем в своих проектах и радуемся созданному функционалу. Данная библиотека позволяет не только вызывать внешние функции, но так же работать с выделением памяти в куче. Вызываем API функции для работы с консолью.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
require 'fiddle'
class WinConsole
Kernel32 = Fiddle.dlopen('Kernel32')
GetStdHandle = Fiddle::Function.new(Kernel32['GetStdHandle'], [Fiddle::TYPE_INT], Fiddle::TYPE_INT)
GetConsoleOutputCP = Fiddle::Function.new(Kernel32['GetConsoleOutputCP'], [], Fiddle::TYPE_INT)
SetConsoleTextAttribute = Fiddle::Function.new(Kernel32['SetConsoleTextAttribute'], [Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_VOID)
SetConsoleCursorPosition = Fiddle::Function.new(Kernel32['SetConsoleCursorPosition'], [Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_VOID)
GetLargestConsoleWindowSize = Fiddle::Function.new(Kernel32['GetLargestConsoleWindowSize'], [Fiddle::TYPE_INT], Fiddle::TYPE_INT)
STD_INPUT_HANDLE = GetStdHandle.call(-10)
STD_OUTPUT_HANDLE = GetStdHandle.call(-11)
STD_ERROR_HANDLE = GetStdHandle.call(-12)
# Устанавливает цвета консоли
# c (Fixnum) - цвет;
# b (Fixnum) - фон;
def self.color(c, b)
SetConsoleTextAttribute.call STD_OUTPUT_HANDLE, (b << 4) + c
end
# Устанавливает курсор в нужную позицию
# x (Fixnum) - координата X;
# y (Fixnum) - координата Y;
def self.locate(x, y)
SetConsoleCursorPosition.call STD_OUTPUT_HANDLE, (y << 16) + x
end
# Возвращает размер самого большого возможного окна консоли
# ret ([Fixnum, Fixnum]) - длинна и ширина;
def self.max_window
result = GetLargestConsoleWindowSize.call STD_OUTPUT_HANDLE
return result & 0xFF, result >> 16
end
# Возвращает кодовую страницу консоли
# ret (Fixnum) - кодовая страница
def self.code_page
GetConsoleOutputCP.call
end
end
WinConsole.locate 10, 5
WinConsole.color 4, 9
p WinConsole.max_window
p WinConsole.code_page