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