Skip to content

Commit f97a642

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 f97a642

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

lib/yamatanooroti/windows/windows-definition.rb

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ module Yamatanooroti::WindowsDefinition
126126
ATTACH_PARENT_PROCESS = -1
127127
KEY_EVENT = 0x0001
128128
SW_HIDE = 0
129+
SW_SHOWNORMAL = 1
129130
SW_SHOWNOACTIVE = 4
130131
SW_SHOWMINNOACTIVE = 7
131132
SW_SHOWNA = 8
@@ -204,9 +205,13 @@ module Yamatanooroti::WindowsDefinition
204205
# BOOL WINAPI GenerateConsoleCtrlEvent(DWORD dwCtrlEvent, DWORD dwProcessGroupId);
205206
extern 'BOOL GenerateConsoleCtrlEvent(DWORD, DWORD);', :stdcall
206207

207-
private def error_message(r, method_name, exception: true)
208-
return if not r.zero?
208+
private def successful_or_if_not_messageout(r, method_name, exception: true)
209+
return true if not r.zero?
209210
err = Fiddle.win32_last_error
211+
if err == 0
212+
$stderr.puts "Info: #{method_name} returns zero but win32_last_error has successful zero."
213+
return true
214+
end
210215
string = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP, FREE)
211216
n = FormatMessageW(
212217
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
@@ -229,30 +234,30 @@ module Yamatanooroti::WindowsDefinition
229234
raise msg
230235
else
231236
$stderr.puts msg
237+
return false
232238
end
233239
end
234240

235241
def get_console_screen_buffer_info(handle)
236242
csbi = CONSOLE_SCREEN_BUFFER_INFO.malloc(FREE)
237243
r = GetConsoleScreenBufferInfo(handle, csbi)
238-
error_message(r, 'GetConsoleScreenBufferInfo')
244+
successful_or_if_not_messageout(r, 'GetConsoleScreenBufferInfo')
239245
return csbi
240246
end
241247

242248
def set_console_screen_buffer_info_ex(handle, h, w, buffer_height)
243249
csbi = CONSOLE_SCREEN_BUFFER_INFOEX.malloc(FREE)
244250
csbi.cbSize = CONSOLE_SCREEN_BUFFER_INFOEX.size
245251
r = GetConsoleScreenBufferInfoEx(handle, csbi)
246-
error_message(r, 'GetConsoleScreenBufferSize')
252+
successful_or_if_not_messageout(r, 'GetConsoleScreenBufferSize')
247253
csbi.dwSize_X = w
248254
csbi.dwSize_Y = buffer_height
249255
csbi.Left = 0
250256
csbi.Right = w - 1
251257
csbi.Top = [csbi.Top, buffer_height - h].min
252258
csbi.Bottom = csbi.Top + h - 1
253259
r = SetConsoleScreenBufferInfoEx(handle, csbi)
254-
error_message(r, 'SetConsoleScreenBufferInfoEx')
255-
return r != 0
260+
return successful_or_if_not_messageout(r, 'SetConsoleScreenBufferInfoEx')
256261
end
257262

258263
def set_console_window_info(handle, h, w)
@@ -262,8 +267,7 @@ def set_console_window_info(handle, h, w)
262267
rect.Right = w - 1
263268
rect.Bottom = h - 1
264269
r = SetConsoleWindowInfo(handle, 1, rect)
265-
error_message(r, 'SetConsoleWindowInfo')
266-
return r != 0
270+
return successful_or_if_not_messageout(r, 'SetConsoleWindowInfo')
267271
end
268272

269273
def set_console_window_size(handle, h, w)
@@ -290,26 +294,24 @@ def create_console_file_handle(name)
290294
0
291295
)
292296
fh = [fh].pack("J").unpack1("J")
293-
error_message(0, name) if fh == INVALID_HANDLE_VALUE
297+
successful_or_if_not_messageout(0, name) if fh == INVALID_HANDLE_VALUE
294298
fh
295299
end
296300

297301
def close_handle(handle)
298302
r = CloseHandle(handle)
299-
error_message(r, "CloseHandle")
300-
return r != 0
303+
return successful_or_if_not_messageout(r, "CloseHandle")
301304
end
302305

303306
def free_console
304307
r = FreeConsole()
305-
error_message(r, "FreeConsole")
306-
return r != 0
308+
return successful_or_if_not_messageout(r, "FreeConsole")
307309
end
308310

309311
def attach_console(pid = ATTACH_PARENT_PROCESS, maybe_fail: false)
310312
r = AttachConsole(pid)
311-
error_message(r, 'AttachConsole') unless maybe_fail
312-
return r != 0
313+
return successful_or_if_not_messageout(r, 'AttachConsole') unless maybe_fail
314+
return r != 0 # || Fiddle.win32_last_error == 0 # this case couses problem
313315
end
314316

315317
SHOWWINDOW_MAP = {
@@ -346,7 +348,7 @@ def create_console(command, show = SW_SHOWNORMAL)
346348
Fiddle::NULL, Fiddle::NULL,
347349
startup_info, console_process_info
348350
)
349-
error_message(r, 'CreateProcessW')
351+
successful_or_if_not_messageout(r, 'CreateProcessW')
350352
end
351353
close_handle(console_process_info.hProcess)
352354
close_handle(console_process_info.hThread)
@@ -355,7 +357,7 @@ def create_console(command, show = SW_SHOWNORMAL)
355357

356358
def get_std_handle(stdhandle)
357359
fh = GetStdHandle(stdhandle)
358-
error_message(0, name) if fh == INVALID_HANDLE_VALUE
360+
successful_or_if_not_messageout(0, name) if fh == INVALID_HANDLE_VALUE
359361
fh
360362
end
361363

@@ -377,7 +379,7 @@ def read_console_output(handle, row, width)
377379
buffer = Fiddle::Pointer.malloc(Fiddle::SIZEOF_SHORT * width, FREE)
378380
n = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
379381
r = ReadConsoleOutputCharacterW(handle, buffer, width, row << 16, n)
380-
error_message(r, "ReadConsoleOutputCharacterW")
382+
successful_or_if_not_messageout(r, "ReadConsoleOutputCharacterW")
381383
return wc2mb(buffer[0, n.to_str.unpack1("L") * 2]).gsub(/ *$/, "")
382384
end
383385

@@ -417,23 +419,22 @@ def build_key_input_record(str)
417419
def write_console_input(handle, records, n)
418420
written = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
419421
r = WriteConsoleInputW(handle, records, n, written)
420-
error_message(r, 'WriteConsoleInput')
422+
successful_or_if_not_messageout(r, 'WriteConsoleInput')
421423
return written.to_str.unpack1('L')
422424
end
423425

424426
def get_number_of_console_input_events(handle)
425427
n = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
426428
r = GetNumberOfConsoleInputEvents(handle, n)
427-
error_message(r, 'GetNumberOfConsoleInputEvents')
429+
successful_or_if_not_messageout(r, 'GetNumberOfConsoleInputEvents')
428430
return n.to_str.unpack1('L')
429431
end
430432

431433
def get_console_mode(handle)
432434
mode = Fiddle::Pointer.malloc(Fiddle::SIZEOF_DWORD, FREE)
433435
mode[0, Fiddle::SIZEOF_DWORD] = "\0".b * Fiddle::SIZEOF_DWORD
434436
r = GetConsoleMode(handle, mode)
435-
error_message(r, 'GetConsoleMode', exception: false)
436-
mode.to_str.unpack1('L')
437+
successful_or_if_not_messageout(r, 'GetConsoleMode', exception: false) ? mode.to_str.unpack1('L') : nil
437438
end
438439

439440
def set_console_mode(handle, mode)
@@ -442,12 +443,12 @@ def set_console_mode(handle, mode)
442443

443444
def set_console_codepage(cp)
444445
r = SetConsoleCP(cp)
445-
error_message(r, 'SetConsoleCP', exception: false)
446+
return successful_or_if_not_messageout(r, 'SetConsoleCP', exception: false)
446447
end
447448

448449
def set_console_output_codepage(cp)
449450
r = SetConsoleOutputCP(cp)
450-
error_message(r, 'SetConsoleOutputCP', exception: false)
451+
return successful_or_if_not_messageout(r, 'SetConsoleOutputCP', exception: false)
451452
end
452453

453454
def get_console_codepage()
@@ -460,8 +461,7 @@ def get_console_output_codepage()
460461

461462
def generate_console_ctrl_event(event, pgrp)
462463
r = GenerateConsoleCtrlEvent(event, pgrp)
463-
error_message(r, 'GenerateConsoleCtrlEvent')
464-
return r != 0
464+
return successful_or_if_not_messageout(r, 'GenerateConsoleCtrlEvent')
465465
end
466466

467467
# Ctrl+C trap support

0 commit comments

Comments
 (0)