From: daz Date: 2005-10-19T01:31:58+09:00 Subject: Re: Win32API and GetFileVersionInfo 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