Skip to content

Commit 0862bca

Browse files
committed
check successful win32_last_error
successful_or_if_not_messageout() returns true otherwise raise exception or message output to stderr
1 parent 2561d29 commit 0862bca

File tree

1 file changed

+25
-26
lines changed

1 file changed

+25
-26
lines changed

lib/yamatanooroti/windows/windows-definition.rb

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,13 @@ module Yamatanooroti::WindowsDefinition
204204
# BOOL WINAPI GenerateConsoleCtrlEvent(DWORD dwCtrlEvent, DWORD dwProcessGroupId);
205205
extern 'BOOL GenerateConsoleCtrlEvent(DWORD, DWORD);', :stdcall
206206

207-
private def error_message(r, method_name, exception: true)
208-
return if not r.zero?
207+
private def successful_or_if_not_messageout(r, method_name, exception: true)
208+
return true if not r.zero?
209209
err = Fiddle.win32_last_error
210+
if err == 0
211+
$stderr.puts "Info: #{method_name} returns zero but win32_last_error has successful zero."
212+
return true
213+
end
210214
string = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP, FREE)
211215
n = FormatMessageW(
212216
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
@@ -229,30 +233,30 @@ module Yamatanooroti::WindowsDefinition
229233
raise msg
230234
else
231235
$stderr.puts msg
236+
return false
232237
end
233238
end
234239

235240
def get_console_screen_buffer_info(handle)
236241
csbi = CONSOLE_SCREEN_BUFFER_INFO.malloc(FREE)
237242
r = GetConsoleScreenBufferInfo(handle, csbi)
238-
error_message(r, 'GetConsoleScreenBufferInfo')
243+
successful_or_if_not_messageout(r, 'GetConsoleScreenBufferInfo')
239244
return csbi
240245
end
241246

242247
def set_console_screen_buffer_info_ex(handle, h, w, buffer_height)
243248
csbi = CONSOLE_SCREEN_BUFFER_INFOEX.malloc(FREE)
244249
csbi.cbSize = CONSOLE_SCREEN_BUFFER_INFOEX.size
245250
r = GetConsoleScreenBufferInfoEx(handle, csbi)
246-
error_message(r, 'GetConsoleScreenBufferSize')
251+
successful_or_if_not_messageout(r, 'GetConsoleScreenBufferSize')
247252
csbi.dwSize_X = w
248253
csbi.dwSize_Y = buffer_height
249254
csbi.Left = 0
250255
csbi.Right = w - 1
251256
csbi.Top = [csbi.Top, buffer_height - h].min
252257
csbi.Bottom = csbi.Top + h - 1
253258
r = SetConsoleScreenBufferInfoEx(handle, csbi)
254-
error_message(r, 'SetConsoleScreenBufferInfoEx')
255-
return r != 0
259+
return successful_or_if_not_messageout(r, 'SetConsoleScreenBufferInfoEx')
256260
end
257261

258262
def set_console_window_info(handle, h, w)
@@ -262,8 +266,7 @@ def set_console_window_info(handle, h, w)
262266
rect.Right = w - 1
263267
rect.Bottom = h - 1
264268
r = SetConsoleWindowInfo(handle, 1, rect)
265-
error_message(r, 'SetConsoleWindowInfo')
266-
return r != 0
269+
return successful_or_if_not_messageout(r, 'SetConsoleWindowInfo')
267270
end
268271

269272
def set_console_window_size(handle, h, w)
@@ -290,26 +293,24 @@ def create_console_file_handle(name)
290293
0
291294
)
292295
fh = [fh].pack("J").unpack1("J")
293-
error_message(0, name) if fh == INVALID_HANDLE_VALUE
296+
successful_or_if_not_messageout(0, name) if fh == INVALID_HANDLE_VALUE
294297
fh
295298
end
296299

297300
def close_handle(handle)
298301
r = CloseHandle(handle)
299-
error_message(r, "CloseHandle")
300-
return r != 0
302+
return successful_or_if_not_messageout(r, "CloseHandle")
301303
end
302304

303305
def free_console
304306
r = FreeConsole()
305-
error_message(r, "FreeConsole")
306-
return r != 0
307+
return successful_or_if_not_messageout(r, "FreeConsole")
307308
end
308309

309310
def attach_console(pid = ATTACH_PARENT_PROCESS, maybe_fail: false)
310311
r = AttachConsole(pid)
311-
error_message(r, 'AttachConsole') unless maybe_fail
312-
return r != 0
312+
return successful_or_if_not_messageout(r, 'AttachConsole') unless maybe_fail
313+
nil
313314
end
314315

315316
SHOWWINDOW_MAP = {
@@ -346,7 +347,7 @@ def create_console(command, show = SW_SHOWNORMAL)
346347
Fiddle::NULL, Fiddle::NULL,
347348
startup_info, console_process_info
348349
)
349-
error_message(r, 'CreateProcessW')
350+
successful_or_if_not_messageout(r, 'CreateProcessW')
350351
end
351352
close_handle(console_process_info.hProcess)
352353
close_handle(console_process_info.hThread)
@@ -355,7 +356,7 @@ def create_console(command, show = SW_SHOWNORMAL)
355356

356357
def get_std_handle(stdhandle)
357358
fh = GetStdHandle(stdhandle)
358-
error_message(0, name) if fh == INVALID_HANDLE_VALUE
359+
successful_or_if_not_messageout(0, name) if fh == INVALID_HANDLE_VALUE
359360
fh
360361
end
361362

@@ -377,7 +378,7 @@ def read_console_output(handle, row, width)
377378
buffer = Fiddle::Pointer.malloc(Fiddle::SIZEOF_SHORT * width, FREE)
378379
n = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
379380
r = ReadConsoleOutputCharacterW(handle, buffer, width, row << 16, n)
380-
error_message(r, "ReadConsoleOutputCharacterW")
381+
successful_or_if_not_messageout(r, "ReadConsoleOutputCharacterW")
381382
return wc2mb(buffer[0, n.to_str.unpack1("L") * 2]).gsub(/ *$/, "")
382383
end
383384

@@ -417,23 +418,22 @@ def build_key_input_record(str)
417418
def write_console_input(handle, records, n)
418419
written = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
419420
r = WriteConsoleInputW(handle, records, n, written)
420-
error_message(r, 'WriteConsoleInput')
421+
successful_or_if_not_messageout(r, 'WriteConsoleInput')
421422
return written.to_str.unpack1('L')
422423
end
423424

424425
def get_number_of_console_input_events(handle)
425426
n = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
426427
r = GetNumberOfConsoleInputEvents(handle, n)
427-
error_message(r, 'GetNumberOfConsoleInputEvents')
428+
successful_or_if_not_messageout(r, 'GetNumberOfConsoleInputEvents')
428429
return n.to_str.unpack1('L')
429430
end
430431

431432
def get_console_mode(handle)
432433
mode = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
433434
mode[0, Fiddle::SIZEOF_DWORD] = "\0".b * Fiddle::SIZEOF_DWORD
434435
r = GetConsoleMode(handle, mode)
435-
error_message(r, 'GetConsoleMode', exception: false)
436-
mode.to_str.unpack1('L')
436+
successful_or_if_not_messageout(r, 'GetConsoleMode', exception: false) ? mode.to_str.unpack1('L') : nil
437437
end
438438

439439
def set_console_mode(handle, mode)
@@ -442,12 +442,12 @@ def set_console_mode(handle, mode)
442442

443443
def set_console_codepage(cp)
444444
r = SetConsoleCP(cp)
445-
error_message(r, 'SetConsoleCP', exception: false)
445+
return successful_or_if_not_messageout(r, 'SetConsoleCP', exception: false)
446446
end
447447

448448
def set_console_output_codepage(cp)
449449
r = SetConsoleOutputCP(cp)
450-
error_message(r, 'SetConsoleOutputCP', exception: false)
450+
return successful_or_if_not_messageout(r, 'SetConsoleOutputCP', exception: false)
451451
end
452452

453453
def get_console_codepage()
@@ -460,8 +460,7 @@ def get_console_output_codepage()
460460

461461
def generate_console_ctrl_event(event, pgrp)
462462
r = GenerateConsoleCtrlEvent(event, pgrp)
463-
error_message(r, 'GenerateConsoleCtrlEvent')
464-
return r != 0
463+
return successful_or_if_not_messageout(r, 'GenerateConsoleCtrlEvent')
465464
end
466465

467466
# Ctrl+C trap support

0 commit comments

Comments
 (0)