From: jim.peak@... Date: 2005-10-19T02:46:58+09:00 Subject: Re: Win32API and GetFileVersionInfo Wow, thanks a lot, that'll be very useful! Jim. daz wrote: > jim.peak... wrote: > > > > VerQueryValue. > > > > This may be similar to Park Heesob's solution since I learned > the memcpy trick from him a while ago. > (It prints the version number of the 'fname') > > #---------------------------- > require 'Win32API' > > fname = 'D:\ruby\bin\ruby.exe' # <------- CHANGE --- ### > > GetFileVersionInfoSize = Win32API.new('Version', 'GetFileVersionInfoSize', 'PP', 'L') > GetFileVersionInfo = Win32API.new('Version', 'GetFileVersionInfo', 'PLLP', 'L') > VerQueryValue = Win32API.new('Version', 'VerQueryValue', 'PPPP', 'I') > memcpy = Win32API.new('msvcrt', 'memcpy', 'PLL', 'L') > > addr = "\0"*4 > v_info_sz = GetFileVersionInfoSize.call(fname, addr) > > raise 'GFVIS failed' if v_info_sz == 0 > > v_info = "\0"*v_info_sz > GetFileVersionInfo.call(fname, 0, v_info_sz, v_info) > > v_val_sz = "\0"*4 > VerQueryValue.call(v_info, '\\', addr, v_val_sz) > > v_bufsz = v_val_sz.unpack('L')[0] > v_buf = "\0" * v_bufsz > v_src = addr.unpack('L')[0] > ret = memcpy.call(v_buf, v_src, v_bufsz) > raise 'memcpy failed' if ret == 0 > > raise 'Oops' unless v_buf[0, 4].unpack('L')[0] == 0xFEEF04BD > > p v_buf[0x08, 8].unpack('S*').values_at(1,0,3,2) #-> [1, 8, 2, 0] > p v_buf[0x10, 8].unpack('S*').values_at(1,0,3,2) #-> [1, 8, 2, 0] > #---------------------------- > > > daz