win32api4ruby 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +1 -0
- data/.autotest +23 -0
- data/History.txt +11 -0
- data/Manifest.txt +19 -0
- data/README.txt +59 -0
- data/Rakefile +13 -0
- data/lib/win32api4ruby/base.rb +167 -0
- data/lib/win32api4ruby/comdlg.rb +179 -0
- data/lib/win32api4ruby/gdi.rb +389 -0
- data/lib/win32api4ruby/kernel.rb +66 -0
- data/lib/win32api4ruby/user.rb +182 -0
- data/lib/win32api4ruby/winspool.rb +320 -0
- data/lib/win32api4ruby.rb +12 -0
- data/test/all_tests.rb +5 -0
- data/test/base.rb +17 -0
- data/test/test_comdlg.rb +30 -0
- data/test/test_gdi.rb +85 -0
- data/test/test_kernel.rb +34 -0
- data/test/test_user.rb +15 -0
- data/test/test_winspool.rb +36 -0
- data.tar.gz.sig +0 -0
- metadata +139 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'win32api4ruby/base'
|
|
4
|
+
|
|
5
|
+
module Win32api4ruby
|
|
6
|
+
class Winspool < Base
|
|
7
|
+
extend FFI::Library
|
|
8
|
+
ffi_lib 'winspool.drv'
|
|
9
|
+
ffi_convention :stdcall
|
|
10
|
+
|
|
11
|
+
PRINTER_ENUM_DEFAULT = 0x00000001
|
|
12
|
+
PRINTER_ENUM_LOCAL = 0x00000002
|
|
13
|
+
PRINTER_ENUM_CONNECTIONS = 0x00000004
|
|
14
|
+
PRINTER_ENUM_FAVORITE = 0x00000004
|
|
15
|
+
PRINTER_ENUM_NAME = 0x00000008
|
|
16
|
+
PRINTER_ENUM_REMOTE = 0x00000010
|
|
17
|
+
PRINTER_ENUM_SHARED = 0x00000020
|
|
18
|
+
PRINTER_ENUM_NETWORK = 0x00000040
|
|
19
|
+
|
|
20
|
+
PRINTER_INFO_1 = 1
|
|
21
|
+
PRINTER_INFO_2 = 2
|
|
22
|
+
PRINTER_INFO_3 = 3
|
|
23
|
+
PRINTER_INFO_4 = 4
|
|
24
|
+
PRINTER_INFO_5 = 5
|
|
25
|
+
|
|
26
|
+
DM_PROMPT = 4
|
|
27
|
+
DM_IN_PROMPT = DM_PROMPT
|
|
28
|
+
DM_MODIFY = 8
|
|
29
|
+
DM_IN_BUFFER = DM_MODIFY
|
|
30
|
+
DM_COPY = 2
|
|
31
|
+
DM_OUT_BUFFER = DM_COPY
|
|
32
|
+
|
|
33
|
+
IDOK = 1
|
|
34
|
+
IDCANCEL = 2
|
|
35
|
+
|
|
36
|
+
attach_function :EnumPrintersA, [ :long, :pointer, :long, :pointer, :long, :pointer, :pointer ], :int
|
|
37
|
+
attach_function :EnumPrintersW, [ :long, :pointer, :long, :pointer, :long, :pointer, :pointer ], :int
|
|
38
|
+
def self.enum_printers(flags, name, level)
|
|
39
|
+
pcbNeeded = FFI::MemoryPointer.new(:long)
|
|
40
|
+
pcReturned = FFI::MemoryPointer.new(:long)
|
|
41
|
+
pcbNeeded.write_long 0
|
|
42
|
+
|
|
43
|
+
# erst einmal ermitteln, wieviel Speicher gebraucht wird
|
|
44
|
+
args = flags, name, level, nil, 0, pcbNeeded, pcReturned
|
|
45
|
+
unicode ? EnumPrintersW(*args) : EnumPrintersA(*args)
|
|
46
|
+
|
|
47
|
+
# und dann die Infos holen
|
|
48
|
+
cbBuf = pcbNeeded.read_long
|
|
49
|
+
# puts "pcbNeeded: #{cbBuf}"
|
|
50
|
+
pPrinterEnum = FFI::MemoryPointer.new(cbBuf)
|
|
51
|
+
exception_for_0{
|
|
52
|
+
args = flags, name, level, pPrinterEnum, cbBuf, pcbNeeded, pcReturned
|
|
53
|
+
unicode ? EnumPrintersW(*args) : EnumPrintersA(*args)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#~ p "Laenge des übergebenen Puffers: #{cbBuf}"
|
|
57
|
+
returned = pcReturned.read_long
|
|
58
|
+
# puts "benoetigte Bytes: #{pcbNeeded.read_long}"
|
|
59
|
+
# puts "zurueckgegebene Drucker: #{returned}"
|
|
60
|
+
|
|
61
|
+
printers = (0...returned).map{|idx|
|
|
62
|
+
case level
|
|
63
|
+
when PRINTER_INFO_4
|
|
64
|
+
create_PRINTER_INFO_4(pPrinterEnum + idx*PRINTER_INFO_4_struct.size)
|
|
65
|
+
else
|
|
66
|
+
raise "unsupported printer info level #{level.inspect}"
|
|
67
|
+
end
|
|
68
|
+
}
|
|
69
|
+
return printers
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
class PRINTER_INFO_4_struct < FFI::Struct
|
|
73
|
+
# typedef self.struct _PRINTER_INFO_4 {
|
|
74
|
+
# LPTSTR pPrinterName;
|
|
75
|
+
# LPTSTR pServerName;
|
|
76
|
+
# DWORD Attributes;
|
|
77
|
+
# }PRINTER_INFO_4, *PPRINTER_INFO_4;
|
|
78
|
+
#
|
|
79
|
+
layout :pPrinterName, :pointer,
|
|
80
|
+
:pServerName, :pointer,
|
|
81
|
+
:Attributes, :uint32
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.create_PRINTER_INFO_4(data_or_size=nil)
|
|
85
|
+
create_struct(PRINTER_INFO_4_struct, data_or_size)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# LONG DocumentProperties(
|
|
90
|
+
# __in HWND hWnd,
|
|
91
|
+
# __in HANDLE hPrinter,
|
|
92
|
+
# __in LPTSTR pDeviceName,
|
|
93
|
+
# __out PDEVMODE pDevModeOutput,
|
|
94
|
+
# __in PDEVMODE pDevModeInput,
|
|
95
|
+
# __in DWORD fMode
|
|
96
|
+
# );
|
|
97
|
+
#
|
|
98
|
+
attach_function :DocumentPropertiesW, [ :handle, :handle, :pointer, :pointer, :pointer, :uint32 ], :long
|
|
99
|
+
attach_function :DocumentPropertiesA, [ :handle, :handle, :pointer, :pointer, :pointer, :uint32 ], :long
|
|
100
|
+
def self.document_properties(hWnd, hPrinter, deviceName, devModeInput, mode)
|
|
101
|
+
# erst einmal ermitteln, wieviel Speicher gebraucht wird
|
|
102
|
+
bufsize = exception_for_negative{
|
|
103
|
+
args = hWnd, hPrinter, deviceName, nil, devModeInput, 0
|
|
104
|
+
unicode ? DocumentPropertiesW(*args) : DocumentPropertiesA(*args)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
# und dann die Infos holen
|
|
108
|
+
pDevModeOutput = create_DEVMOD(bufsize)
|
|
109
|
+
res = exception_for_negative{
|
|
110
|
+
args = hWnd, hPrinter, deviceName, pDevModeOutput, devModeInput, mode
|
|
111
|
+
unicode ? DocumentPropertiesW(*args) : DocumentPropertiesA(*args)
|
|
112
|
+
}
|
|
113
|
+
if res==IDOK
|
|
114
|
+
return pDevModeOutput
|
|
115
|
+
else
|
|
116
|
+
return nil
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
attach_function :OpenPrinterW, [ :pointer, :pointer, :pointer ], :long
|
|
122
|
+
attach_function :OpenPrinterA, [ :pointer, :pointer, :pointer ], :long
|
|
123
|
+
# BOOL OpenPrinter(
|
|
124
|
+
# __in LPTSTR pPrinterName,
|
|
125
|
+
# __out LPHANDLE phPrinter,
|
|
126
|
+
# __in LPPRINTER_DEFAULTS pDefault
|
|
127
|
+
# );
|
|
128
|
+
def self.open_printer(pPrinterName, phPrinter, pDefault)
|
|
129
|
+
check(pPrinterName,String)
|
|
130
|
+
#phPrinter is the PRINTER_DEFAULTS structure.. 0 for default
|
|
131
|
+
# since we want to send through a zero for default, can't enforce string check...
|
|
132
|
+
exception_for_0{
|
|
133
|
+
args = pPrinterName, phPrinter, pDefault
|
|
134
|
+
unicode ? OpenPrinterW(*args) : OpenPrinterA(*args)
|
|
135
|
+
}
|
|
136
|
+
end
|
|
137
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
138
|
+
|
|
139
|
+
attach_function :ClosePrinter, [ :handle ], :int
|
|
140
|
+
def self.close_printer(hPrinter)
|
|
141
|
+
exception_for_0{
|
|
142
|
+
ClosePrinter(hPrinter)
|
|
143
|
+
}
|
|
144
|
+
end
|
|
145
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
146
|
+
|
|
147
|
+
attach_function :AbortPrinter, [ :handle ], :int
|
|
148
|
+
def self.abort_printer(hPrinter)
|
|
149
|
+
exception_for_0{
|
|
150
|
+
AbortPrinter(hPrinter)
|
|
151
|
+
}
|
|
152
|
+
end
|
|
153
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
154
|
+
|
|
155
|
+
attach_function :StartDocPrinterA, [ :handle, :uint32, :pointer ], :uint32
|
|
156
|
+
attach_function :StartDocPrinterW, [ :handle, :uint32, :pointer ], :uint32
|
|
157
|
+
def self.start_doc_printer(hPrinter, level, pDocInfo)
|
|
158
|
+
check(level, Integer);
|
|
159
|
+
# check(pDocInfo, String)
|
|
160
|
+
exception_for_0{
|
|
161
|
+
args = hPrinter, level, pDocInfo
|
|
162
|
+
unicode ? StartDocPrinterW(*args) : StartDocPrinterA(*args)
|
|
163
|
+
}
|
|
164
|
+
end
|
|
165
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
166
|
+
|
|
167
|
+
attach_function :EndDocPrinter, [ :handle ], :int
|
|
168
|
+
def self.end_doc_printer(hPrinter)
|
|
169
|
+
exception_for_0{
|
|
170
|
+
EndDocPrinter(hPrinter)
|
|
171
|
+
}
|
|
172
|
+
end
|
|
173
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
174
|
+
|
|
175
|
+
attach_function :StartPagePrinter, [ :handle ], :int
|
|
176
|
+
def self.start_page_printer(hPrinter)
|
|
177
|
+
exception_for_0{
|
|
178
|
+
StartPagePrinter(hPrinter)
|
|
179
|
+
}
|
|
180
|
+
end
|
|
181
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
182
|
+
|
|
183
|
+
attach_function :EndPagePrinter, [ :handle ], :int
|
|
184
|
+
def self.end_page_printer(hPrinter)
|
|
185
|
+
exception_for_0{
|
|
186
|
+
EndPagePrinter(hPrinter)
|
|
187
|
+
}
|
|
188
|
+
end
|
|
189
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
190
|
+
|
|
191
|
+
attach_function :GetPrinterA, [ :handle, :uint32, :pointer, :uint32, :pointer ], :int
|
|
192
|
+
attach_function :GetPrinterW, [ :handle, :uint32, :pointer, :uint32, :pointer ], :int
|
|
193
|
+
def self.get_printer(hPrinter, level, pPrinter, cbBuf, pcbNeeded)
|
|
194
|
+
#~ BOOL GetPrinter(
|
|
195
|
+
#~ __in HANDLE hPrinter,
|
|
196
|
+
#~ __in DWORD Level,
|
|
197
|
+
#~ __out LPBYTE pPrinter,
|
|
198
|
+
#~ __in DWORD cbBuf,
|
|
199
|
+
#~ __out LPDWORD pcbNeeded
|
|
200
|
+
#~ );
|
|
201
|
+
#~ exception_for_0{
|
|
202
|
+
args = hPrinter, level, pPrinter, cbBuf, pcbNeeded
|
|
203
|
+
unicode ? GetPrinterW(*args) : GetPrinterA(*args)
|
|
204
|
+
#~ }
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
208
|
+
|
|
209
|
+
attach_function :WritePrinter, [ :handle, :pointer, :uint32, :pointer ], :int
|
|
210
|
+
def self.write_printer(hPrinter, pBuf)
|
|
211
|
+
#~ BOOL WritePrinter(
|
|
212
|
+
#~ __in HANDLE hPrinter,
|
|
213
|
+
#~ __in LPVOID pBuf,
|
|
214
|
+
#~ __in DWORD cbBuf,
|
|
215
|
+
#~ __out LPDWORD pcWritten
|
|
216
|
+
#~ );
|
|
217
|
+
pcWritten = FFI::MemoryPointer.new :uint32
|
|
218
|
+
exception_for_0{
|
|
219
|
+
WritePrinter(hPrinter, pBuf, pBuf.length, pcWritten)
|
|
220
|
+
}
|
|
221
|
+
pcWritten.read_uint32
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
class DOC_INFO_1W < FFI::Struct
|
|
225
|
+
layout :pDocName, :pointer,
|
|
226
|
+
:pOutputFile, :pointer,
|
|
227
|
+
:pDatatype, :pointer
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
class DOC_INFO_1A < FFI::Struct
|
|
231
|
+
layout :pDocName, :pointer,
|
|
232
|
+
:pOutputFile, :pointer,
|
|
233
|
+
:pDatatype, :pointer
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def self.create_DOC_INFO_1(data_or_size=nil)
|
|
237
|
+
create_struct(unicode ? DOC_INFO_1W : DOC_INFO_1A, data_or_size)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
#-----------------------------------------------------------------------------------------------------------------
|
|
241
|
+
|
|
242
|
+
class DEVMODW < FFI::Struct
|
|
243
|
+
layout :dmDeviceName, [:uint16, 32],
|
|
244
|
+
:dmSpecVersion, :uint16,
|
|
245
|
+
:dmDriverVersion, :uint16,
|
|
246
|
+
:dmSize, :uint16,
|
|
247
|
+
:dmDriverExtra, :uint16,
|
|
248
|
+
:dmFields, :uint32,
|
|
249
|
+
:dmOrientation, :int16,
|
|
250
|
+
:dmPaperSize, :int16,
|
|
251
|
+
:dmPaperLength, :int16,
|
|
252
|
+
:dmPaperWidth, :int16,
|
|
253
|
+
:dmScale, :int16,
|
|
254
|
+
:dmCopies, :int16,
|
|
255
|
+
:dmDefaultSource, :int16,
|
|
256
|
+
:dmPrintQuality, :int16,
|
|
257
|
+
:dmColor, :int16,
|
|
258
|
+
:dmDuplex, :int16,
|
|
259
|
+
:dmYResolution, :int16,
|
|
260
|
+
:dmTTOption, :int16,
|
|
261
|
+
:dmCollate, :int16,
|
|
262
|
+
:dmFormName, [:uint16, 32],
|
|
263
|
+
:dmLogPixels, :uint16,
|
|
264
|
+
:dmBitsPerPel, :uint32,
|
|
265
|
+
:dmPelsWidth, :uint32,
|
|
266
|
+
:dmPelsHeight, :uint32,
|
|
267
|
+
:dmNup, :uint32,
|
|
268
|
+
:dmDisplayFrequency, :uint32,
|
|
269
|
+
:dmICMMethod, :uint32,
|
|
270
|
+
:dmICMIntent, :uint32,
|
|
271
|
+
:dmMediaType, :uint32,
|
|
272
|
+
:dmDitherType, :uint32,
|
|
273
|
+
:dmReserved1, :uint32,
|
|
274
|
+
:dmReserved2, :uint32,
|
|
275
|
+
:dmPanningWidth, :uint32,
|
|
276
|
+
:dmPanningHeight, :uint32
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
class DEVMODA < FFI::Struct
|
|
280
|
+
layout :dmDeviceName, [:uint8, 32],
|
|
281
|
+
:dmSpecVersion, :uint16,
|
|
282
|
+
:dmDriverVersion, :uint16,
|
|
283
|
+
:dmSize, :uint16,
|
|
284
|
+
:dmDriverExtra, :uint16,
|
|
285
|
+
:dmFields, :uint32,
|
|
286
|
+
:dmOrientation, :int16,
|
|
287
|
+
:dmPaperSize, :int16,
|
|
288
|
+
:dmPaperLength, :int16,
|
|
289
|
+
:dmPaperWidth, :int16,
|
|
290
|
+
:dmScale, :int16,
|
|
291
|
+
:dmCopies, :int16,
|
|
292
|
+
:dmDefaultSource, :int16,
|
|
293
|
+
:dmPrintQuality, :int16,
|
|
294
|
+
:dmColor, :int16,
|
|
295
|
+
:dmDuplex, :int16,
|
|
296
|
+
:dmYResolution, :int16,
|
|
297
|
+
:dmTTOption, :int16,
|
|
298
|
+
:dmCollate, :int16,
|
|
299
|
+
:dmFormName, [:uint8, 32],
|
|
300
|
+
:dmLogPixels, :uint16,
|
|
301
|
+
:dmBitsPerPel, :uint32,
|
|
302
|
+
:dmPelsWidth, :uint32,
|
|
303
|
+
:dmPelsHeight, :uint32,
|
|
304
|
+
:dmNup, :uint32,
|
|
305
|
+
:dmDisplayFrequency, :uint32,
|
|
306
|
+
:dmICMMethod, :uint32,
|
|
307
|
+
:dmICMIntent, :uint32,
|
|
308
|
+
:dmMediaType, :uint32,
|
|
309
|
+
:dmDitherType, :uint32,
|
|
310
|
+
:dmReserved1, :uint32,
|
|
311
|
+
:dmReserved2, :uint32,
|
|
312
|
+
:dmPanningWidth, :uint32,
|
|
313
|
+
:dmPanningHeight, :uint32
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def self.create_DEVMOD(data_or_size=nil)
|
|
317
|
+
create_struct(unicode ? DEVMODW : DEVMODA, data_or_size)
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
|
|
3
|
+
module Win32api4ruby
|
|
4
|
+
VERSION = '0.2.2'
|
|
5
|
+
|
|
6
|
+
autoload 'Base', 'win32api4ruby/base'
|
|
7
|
+
autoload 'Comdlg', 'win32api4ruby/comdlg'
|
|
8
|
+
autoload 'Gdi', 'win32api4ruby/gdi'
|
|
9
|
+
autoload 'Kernel', 'win32api4ruby/kernel'
|
|
10
|
+
autoload 'User', 'win32api4ruby/user'
|
|
11
|
+
autoload 'Winspool', 'win32api4ruby/winspool'
|
|
12
|
+
end
|
data/test/all_tests.rb
ADDED
data/test/base.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
def define_test_class(modul)
|
|
3
|
+
Class.instance_eval <<-EOT
|
|
4
|
+
class TestAnsi#{modul} < Test::Unit::TestCase
|
|
5
|
+
include #{modul}
|
|
6
|
+
def setup
|
|
7
|
+
Win32api4ruby::Base.unicode = false
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
class TestUnicode#{modul} < Test::Unit::TestCase
|
|
11
|
+
include #{modul}
|
|
12
|
+
def setup
|
|
13
|
+
Win32api4ruby::Base.unicode = true
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
EOT
|
|
17
|
+
end
|
data/test/test_comdlg.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "win32api4ruby"
|
|
3
|
+
require File.join(File.dirname(__FILE__),"base")
|
|
4
|
+
|
|
5
|
+
module TestComdlg
|
|
6
|
+
include Win32api4ruby
|
|
7
|
+
|
|
8
|
+
def test_print_dialog
|
|
9
|
+
# wird zwar gestartet, liefert aber keine gef�llte struktur zur�ck
|
|
10
|
+
pdlg = Comdlg.create_PRINTDLG
|
|
11
|
+
pdlg[:hwndOwner] = 0
|
|
12
|
+
pdlg[:Flags] = Comdlg::PD_RETURNDC | Comdlg::PD_NOSELECTION
|
|
13
|
+
ok = Comdlg.print_dlg(pdlg)
|
|
14
|
+
|
|
15
|
+
puts "res: #{ok.to_s(16)}" # pdlg: #{pdlg.values}"
|
|
16
|
+
hDevNames = pdlg[:hDevNames]
|
|
17
|
+
Kernel.with_global_lock(hDevNames){|pDevNames|
|
|
18
|
+
dn_prt = Comdlg.create_DEVNAMES(pDevNames)
|
|
19
|
+
|
|
20
|
+
u = Base.unicode ? 2 : 1
|
|
21
|
+
driver = FFI::Pointer.new(pDevNames+dn_prt[:wDriverOffset]*u).to_s_utf8
|
|
22
|
+
device = FFI::Pointer.new(pDevNames+dn_prt[:wDeviceOffset]*u).to_s_utf8
|
|
23
|
+
output = FFI::Pointer.new(pDevNames+dn_prt[:wOutputOffset]*u).to_s_utf8
|
|
24
|
+
default = FFI::Pointer.new(pDevNames+dn_prt[:wDefault]*u).to_s_utf8
|
|
25
|
+
puts "Driver: #{driver.inspect} Device: #{device.inspect} Output: #{output.inspect} Default: #{default.inspect}"
|
|
26
|
+
}
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
define_test_class(TestComdlg)
|
data/test/test_gdi.rb
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "win32api4ruby"
|
|
3
|
+
require File.join(File.dirname(__FILE__),"base")
|
|
4
|
+
|
|
5
|
+
module TestGdi
|
|
6
|
+
include Win32api4ruby
|
|
7
|
+
|
|
8
|
+
def test_create_font
|
|
9
|
+
nHeight = 0
|
|
10
|
+
nWidth = 0
|
|
11
|
+
nEscapement = 0
|
|
12
|
+
nOrientation = 0
|
|
13
|
+
fnWeight = 400
|
|
14
|
+
fdwItalic = 0
|
|
15
|
+
fdwUnderline = 0
|
|
16
|
+
fdwStrikeOut = 0
|
|
17
|
+
fdwCharSet = 0
|
|
18
|
+
fdwOutputPrecision = 0
|
|
19
|
+
fdwClipPrecision = 0
|
|
20
|
+
fdwQuality = 0
|
|
21
|
+
fdwPitchAndFamily = 0
|
|
22
|
+
lpszFace = "Arial".to_s_win32
|
|
23
|
+
|
|
24
|
+
font = Gdi.create_font(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, lpszFace)
|
|
25
|
+
|
|
26
|
+
assert font.to_i != 0
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_create_bitmap
|
|
30
|
+
hwnd = User.create_window_ex(0, 'STATIC'.to_s_win32, 'Name'.to_s_win32, User::WS_VISIBLE, 0,0,600,300, nil, nil, nil)
|
|
31
|
+
hdc = User.get_dc(hwnd)
|
|
32
|
+
lpbmi = Gdi.create_BITMAPINFOHEADER
|
|
33
|
+
|
|
34
|
+
xDest, yDest, dwWidth, dwHeight, xSrc, ySrc = 0,0, 60,50, 0,0
|
|
35
|
+
lpvBits = ('z000'+'0z00'+'00z0') * (dwWidth/3) * dwHeight
|
|
36
|
+
uStartScan, cScanLines = 0, dwHeight
|
|
37
|
+
fuColorUse = Gdi::DIB_RGB_COLORS
|
|
38
|
+
|
|
39
|
+
lpbmi[:biWidth] = dwWidth
|
|
40
|
+
lpbmi[:biHeight] = dwHeight
|
|
41
|
+
lpbmi[:biPlanes] = 1
|
|
42
|
+
lpbmi[:biBitCount] = 32
|
|
43
|
+
lpbmi[:biCompression] = Gdi::BI_RGB
|
|
44
|
+
lpbmi[:biSizeImage] = lpvBits.length
|
|
45
|
+
lpbmi[:biXPelsPerMeter] = 0
|
|
46
|
+
lpbmi[:biYPelsPerMeter] = 0
|
|
47
|
+
lpbmi[:biClrUsed] = 0
|
|
48
|
+
lpbmi[:biClrImportant] = 0
|
|
49
|
+
|
|
50
|
+
Gdi.set_dibits_to_device(hdc, xDest, yDest, dwWidth, dwHeight, xSrc, ySrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_escape
|
|
54
|
+
hPrinter = Win32api4ruby::Gdi.create_dc(nil, "Microsoft XPS Document Writer".to_s_win32, nil, nil)
|
|
55
|
+
#~ hPrinter = Win32api4ruby::Gdi.create_dc(nil, "Zebra P430i Card Printer USB".to_s_win32, nil, nil)
|
|
56
|
+
|
|
57
|
+
documentName = "Test Escape"
|
|
58
|
+
docinfo = Win32api4ruby::Gdi.create_DOCINFO
|
|
59
|
+
docinfo[:lpszDocName] = documentName.to_s_win32
|
|
60
|
+
Gdi.start_doc(hPrinter, docinfo)
|
|
61
|
+
|
|
62
|
+
send_escape(hPrinter, "MCL")
|
|
63
|
+
send_escape(hPrinter, "MCI")
|
|
64
|
+
|
|
65
|
+
Gdi.end_doc(hPrinter)
|
|
66
|
+
Gdi.delete_dc(hPrinter)
|
|
67
|
+
GC.start
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def send_escape(hPrinter, escape)
|
|
73
|
+
command = ["1B", escape, "0D"].pack("H*a*H*")
|
|
74
|
+
puts("Send #{escape}")
|
|
75
|
+
start = Time.now
|
|
76
|
+
Gdi.escape(hPrinter, Gdi::PASSTHROUGH, [command.length, command].pack('va*'), nil)
|
|
77
|
+
# dur = Time.now - start
|
|
78
|
+
# puts("Time for #{escape}: #{dur}s")
|
|
79
|
+
# puts("Sleep for 5s...")
|
|
80
|
+
sleep(5)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
define_test_class(TestGdi)
|
data/test/test_kernel.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "win32api4ruby"
|
|
3
|
+
require "ffi"
|
|
4
|
+
require File.join(File.dirname(__FILE__),"base")
|
|
5
|
+
|
|
6
|
+
module TestKernel
|
|
7
|
+
include Win32api4ruby
|
|
8
|
+
|
|
9
|
+
def test_global_lock
|
|
10
|
+
assert_raise(Win32api4ruby::Base::ApiError){
|
|
11
|
+
Kernel.global_lock(FFI::Pointer.new(1234567))
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_format_message
|
|
16
|
+
message = FFI::MemoryPointer.new(1024) #store 1kb space
|
|
17
|
+
Kernel.format_message(0x1000, '', 100, 0, message, 1024, '')
|
|
18
|
+
mu = message.to_s_utf8
|
|
19
|
+
assert mu.length > 5
|
|
20
|
+
assert mu.length < 100
|
|
21
|
+
if String.method_defined?(:encoding)
|
|
22
|
+
assert mu.valid_encoding?
|
|
23
|
+
assert_equal Encoding::UTF_8, mu.encoding
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_get_set_last_error
|
|
28
|
+
Kernel.set_last_error(100)
|
|
29
|
+
# get_last_error wird bereits irgendwo vorher abgefragt:
|
|
30
|
+
assert_equal 100, Kernel.get_last_error
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
define_test_class(TestKernel)
|
data/test/test_user.rb
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "win32api4ruby"
|
|
3
|
+
require File.join(File.dirname(__FILE__),"base")
|
|
4
|
+
|
|
5
|
+
module TestUser
|
|
6
|
+
include Win32api4ruby
|
|
7
|
+
|
|
8
|
+
def test_create_window_ex
|
|
9
|
+
hwnd = User.create_window_ex(0, 'Button'.to_s_win32, "name".to_s_win32, User::WS_VISIBLE, 0,0,100,100, nil, nil, nil)
|
|
10
|
+
assert hwnd.to_i > 0
|
|
11
|
+
User.destroy_window(hwnd)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
define_test_class(TestUser)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "win32api4ruby"
|
|
3
|
+
require File.join(File.dirname(__FILE__),"base")
|
|
4
|
+
|
|
5
|
+
module TestWinspool
|
|
6
|
+
include Win32api4ruby
|
|
7
|
+
|
|
8
|
+
def test_enum_printers
|
|
9
|
+
flags = Winspool::PRINTER_ENUM_NAME
|
|
10
|
+
name = nil
|
|
11
|
+
level = 4
|
|
12
|
+
infos = Winspool.enum_printers(flags, name, level)
|
|
13
|
+
infos[0..1].each{|info|
|
|
14
|
+
puts "PrinterName: #{info[:pPrinterName].to_s_utf8}, ServerName: #{info[:pServerName].to_s_utf8}, Attributes: #{info[:Attributes]}"
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_document_properties
|
|
19
|
+
flags = Winspool::PRINTER_ENUM_NAME
|
|
20
|
+
name = nil
|
|
21
|
+
level = 4
|
|
22
|
+
infos = Winspool.enum_printers(flags, name, level)
|
|
23
|
+
info = infos[0]
|
|
24
|
+
|
|
25
|
+
if info
|
|
26
|
+
devmod = Winspool.document_properties nil, nil, info[:pPrinterName], nil, Winspool::DM_OUT_BUFFER
|
|
27
|
+
assert devmod.size > 10
|
|
28
|
+
assert_operator 50..10000, :===, devmod[:dmYResolution]
|
|
29
|
+
assert_operator 50..10000, :===, devmod[:dmPrintQuality]
|
|
30
|
+
else
|
|
31
|
+
puts "no printer installed"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
define_test_class(TestWinspool)
|
data.tar.gz.sig
ADDED
|
Binary file
|
metadata
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: win32api4ruby
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Lars Kanis
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain:
|
|
10
|
+
- |
|
|
11
|
+
-----BEGIN CERTIFICATE-----
|
|
12
|
+
MIIEBDCCAmygAwIBAgIBBDANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
|
|
13
|
+
L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yNjAxMDUxMTE5MzRaFw0yNzAx
|
|
14
|
+
MDUxMTE5MzRaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
|
|
15
|
+
PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
|
|
16
|
+
mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
|
|
17
|
+
eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
|
|
18
|
+
8nBMvR0mHo77kIkapHc26UzVq/G0nKLfDsIHXVylto3PjzOumjG6GhmFN4r3cP6e
|
|
19
|
+
SDfl1FSeRYVpt4kmQULz/zdSaOH3AjAq7PM2Z91iGwQvoUXMANH2v89OWjQO/NHe
|
|
20
|
+
JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
|
|
21
|
+
eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
|
|
22
|
+
chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
|
|
23
|
+
9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjOTA3MAkG
|
|
24
|
+
A1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQ4h1tIyvdUWtMI739xMzTR
|
|
25
|
+
7EfMFzANBgkqhkiG9w0BAQsFAAOCAYEAg/1LuXN3X8xwHVnhRvmBCZYkNErko40y
|
|
26
|
+
juq/qPF9vkPGxLEGaeZF1rv/obTs5SgIGEUkWdRsOl3F6bQN4MYUFlN/n6rPx19g
|
|
27
|
+
CqUMkmRtuFD+9EFBI4twoF2IJS0pYr9tkjUq8mb0VXblvfbEEUf460BJmuBXZTc6
|
|
28
|
+
OoLQHxjhhqhKBoP4lHXg/OMK9dnGn8+5DoKcsyWQvqq/GdK8pi4E47M/egzw54Go
|
|
29
|
+
g+oeyGDsNKOQlnIA9gbyPpExD1+akJ4v88T8jOUnsOkhBBUkpSktC2QmEYIU5e9j
|
|
30
|
+
N7muw6O5Bz3CQuSWIEjj9mMUS2fEEfq2km6zO5vs5eD6TdFnt8AC/HlOrPaxGcUX
|
|
31
|
+
Hjw/K7ZTvZLEb4awRijdy4wx3OlL9FAyZPjYOh8TdJrLl076c7GyimAkgnc8BrL5
|
|
32
|
+
g1vGc759o2t3KNnlUg8VwqkhFJp4gCko1QO/8Io5hPQZOvJw8dmqNiiiHqaDupfl
|
|
33
|
+
CI4mk2K8yQa8xtQ/RmFZxYS5XbHhDJCw
|
|
34
|
+
-----END CERTIFICATE-----
|
|
35
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
36
|
+
dependencies:
|
|
37
|
+
- !ruby/object:Gem::Dependency
|
|
38
|
+
name: ffi
|
|
39
|
+
requirement: !ruby/object:Gem::Requirement
|
|
40
|
+
requirements:
|
|
41
|
+
- - ">="
|
|
42
|
+
- !ruby/object:Gem::Version
|
|
43
|
+
version: 1.0.0
|
|
44
|
+
type: :runtime
|
|
45
|
+
prerelease: false
|
|
46
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
47
|
+
requirements:
|
|
48
|
+
- - ">="
|
|
49
|
+
- !ruby/object:Gem::Version
|
|
50
|
+
version: 1.0.0
|
|
51
|
+
- !ruby/object:Gem::Dependency
|
|
52
|
+
name: rdoc
|
|
53
|
+
requirement: !ruby/object:Gem::Requirement
|
|
54
|
+
requirements:
|
|
55
|
+
- - ">="
|
|
56
|
+
- !ruby/object:Gem::Version
|
|
57
|
+
version: '6.0'
|
|
58
|
+
- - "<"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '8'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '6.0'
|
|
68
|
+
- - "<"
|
|
69
|
+
- !ruby/object:Gem::Version
|
|
70
|
+
version: '8'
|
|
71
|
+
- !ruby/object:Gem::Dependency
|
|
72
|
+
name: hoe
|
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
|
74
|
+
requirements:
|
|
75
|
+
- - "~>"
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '4.7'
|
|
78
|
+
type: :development
|
|
79
|
+
prerelease: false
|
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
81
|
+
requirements:
|
|
82
|
+
- - "~>"
|
|
83
|
+
- !ruby/object:Gem::Version
|
|
84
|
+
version: '4.7'
|
|
85
|
+
description: |
|
|
86
|
+
Yet another win32 to ruby wrapper
|
|
87
|
+
|
|
88
|
+
==== To Install:
|
|
89
|
+
email:
|
|
90
|
+
- lars@greiz-reinsdorf.de
|
|
91
|
+
executables: []
|
|
92
|
+
extensions: []
|
|
93
|
+
extra_rdoc_files:
|
|
94
|
+
- History.txt
|
|
95
|
+
- README.txt
|
|
96
|
+
files:
|
|
97
|
+
- ".autotest"
|
|
98
|
+
- History.txt
|
|
99
|
+
- Manifest.txt
|
|
100
|
+
- README.txt
|
|
101
|
+
- Rakefile
|
|
102
|
+
- lib/win32api4ruby.rb
|
|
103
|
+
- lib/win32api4ruby/base.rb
|
|
104
|
+
- lib/win32api4ruby/comdlg.rb
|
|
105
|
+
- lib/win32api4ruby/gdi.rb
|
|
106
|
+
- lib/win32api4ruby/kernel.rb
|
|
107
|
+
- lib/win32api4ruby/user.rb
|
|
108
|
+
- lib/win32api4ruby/winspool.rb
|
|
109
|
+
- test/all_tests.rb
|
|
110
|
+
- test/base.rb
|
|
111
|
+
- test/test_comdlg.rb
|
|
112
|
+
- test/test_gdi.rb
|
|
113
|
+
- test/test_kernel.rb
|
|
114
|
+
- test/test_user.rb
|
|
115
|
+
- test/test_winspool.rb
|
|
116
|
+
homepage: https://github.com/larskanis/win32api4ruby
|
|
117
|
+
licenses:
|
|
118
|
+
- MIT
|
|
119
|
+
metadata: {}
|
|
120
|
+
rdoc_options:
|
|
121
|
+
- "--main"
|
|
122
|
+
- README.txt
|
|
123
|
+
require_paths:
|
|
124
|
+
- lib
|
|
125
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
|
+
requirements:
|
|
127
|
+
- - ">="
|
|
128
|
+
- !ruby/object:Gem::Version
|
|
129
|
+
version: '0'
|
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
|
+
requirements:
|
|
132
|
+
- - ">="
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: '0'
|
|
135
|
+
requirements: []
|
|
136
|
+
rubygems_version: 4.0.16
|
|
137
|
+
specification_version: 4
|
|
138
|
+
summary: 'Yet another win32 to ruby wrapper ==== To Install:'
|
|
139
|
+
test_files: []
|