Ruby中有没有办法找到文件的版本,特别是.dll文件?

===============>>#1 票数:12

对于Windows EXE和DLL:

require "Win32API"
FILENAME = "c:/ruby/bin/ruby.exe" #your filename here
s=""
vsize=Win32API.new('version.dll', 'GetFileVersionInfoSize', 
                   ['P', 'P'], 'L').call(FILENAME, s)
p vsize
if (vsize > 0)
  result = ' '*vsize
  Win32API.new('version.dll', 'GetFileVersionInfo', 
               ['P', 'L', 'L', 'P'], 'L').call(FILENAME, 0, vsize, result)
  rstring = result.unpack('v*').map{|s| s.chr if s<256}*''
  r = /FileVersion..(.*?)\000/.match(rstring)
  puts "FileVersion = #{r ? r[1] : '??' }"
else
  puts "No Version Info"
end

'unpack'+ regexp部分是一个hack,“正确”的方式是VerQueryValue API,但这适用于大多数文件。 (可能在扩展字符集上失败了。)

===============>>#2 票数:5

如果你想用ruby获取版本信息怎么办,但ruby代码没有在Windows上运行?

以下就是这样(注意相同的扩展charset警告):

#!/usr/bin/ruby

s = File.read(ARGV[0])
x = s.match(/F\0i\0l\0e\0V\0e\0r\0s\0i\0o\0n\0*(.*?)\0\0\0/)

if x.class == MatchData
  ver=x[1].gsub(/\0/,"")
else
  ver="No version"
end

puts ver

===============>>#3 票数:3

从Ruby 2.0开始,不推荐使用DL模块。 以下是使用Fiddle的AShelly答案的更新版本:

version_dll = Fiddle.dlopen('version.dll')

s=''
vsize = Fiddle::Function.new(version_dll['GetFileVersionInfoSize'],
            [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],
            Fiddle::TYPE_LONG).call(filename, s)

raise 'Unable to determine the version number' unless vsize > 0

result = ' '*vsize
Fiddle::Function.new(version_dll['GetFileVersionInfo'],
                     [Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG,
                      Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP],
        Fiddle::TYPE_VOIDP).call(filename, 0, vsize, result)

rstring = result.unpack('v*').map{|s| s.chr if s<256}*''
r = /FileVersion..(.*?)\000/.match(rstring)

puts r[1]

===============>>#4 票数:3

如果您正在使用Microsoft平台,那么您应该能够使用Ruby中的Win32 API来调用GetFileVersionInfo(),它将返回您正在查找的信息。 http://msdn.microsoft.com/en-us/library/ms647003.aspx

===============>>#5 票数:1

对于任何文件,您需要发现文件的格式,然后打开文件并读取必要的字节以找出文件的版本。 没有API或常用方法来确定Ruby中的文件版本。

请注意,如果文件版本在文件名中会更容易。

  ask by translate from so

未解决问题?本站智能推荐:

4回复

如何检查编译DLL文件的.NET Framework版本? [重复]

可能重复: 确定程序集(CLR)版本的程序集 我有一个在.NET Framework中编译的库/ DLL文件。 现在(没有任何编码)我想检查用于编译此库的.NET Framework版本。 我需要知道它是2.0,3.5还是4.0。 有没有任何工具可以帮助我实现这一目标?
4回复

如何在C ++中获取DLL文件的版本信息

我需要获取在Visual Studio 2008 C ++中创建的DLL文件的版本信息。 我如何得到它?
1回复

获取已经加载的DLL的版本(Windows API)

好的,在加载之前获取dll的文件版本很容易。 即时通讯使用GetFileVersionInfoSize + GetFileVersionInfo + VerQueryValue,它的工作原理就像一个魅力。 但是,如果该dll已经加载怎么办? 我知道您可以使用LoadLibrary +
2回复

在Windows上回滚Ruby版本

您如何从Ruby 1.9回滚到Ruby 1.8?
1回复

Ansible-版本文件检查

我希望能够读取版本文件(如果存在)并检查其内容。 如果版本已更改或文件不存在,则返回True;如果versionfile存在且版本与内容匹配,则返回False。 基本上是这样的: 我的问题是:这有点丑陋,在我的角色中变得多余。 有没有更优雅的方法可以做到这一点? 也许有一个模
1回复

Groovy检索文件版本属性(Windows)

您能帮我从Groovy脚本中检索文件版本属性(在Windows平台中)吗? 我的意思是通过右键单击文件名打开的文件属性窗口的“ 详细信息”选项卡中的Windows(7)中可用的Version属性。 我发现仅使用WSH可以做到。 提前致谢!
1回复

在Windows中将版本号添加到通用文件

上次编辑:无法将版本号添加到Windows中的通用文件。 Windows中的版本控制来自附加到二进制可执行文件(例如.EXE或.DLL)的VERSIONINFO资源。 该资源不能附加到任何任意文件,也不是任何备用数据流的一部分。 我以为版本信息存储在备用数据流中,但事实并非如此。
2回复

VB.net获取DLL文件版本

我有一个项目,我一直负责,安装一些Microsoft KB,但他们希望我检查一旦KB已安装,它已更新DLL和唯一的方式,我可以看到他们不同是由DLL版。 有没有办法让VB.net检查DLL文件版本(右击 - 属性 - 详细信息 - 文件版本)? 我在互联网上发现了一些东西,但是我不能
5回复

在.NET中编译与版本无关的DLL

脚本 我有两个围绕Microsoft Office的包装器,一个用于2003,一个用于2007.由于两个版本的Microsoft Office并排运行“不正式”,也不是微软推荐的,我们有两个盒子,一个用Office 2003和另一个使用Office 2007.我们分别编译包装器。 DLL
1回复

如何在程序代码中设置DLL的版本?

我正在将Visual Studio 2012用于C ++ DLL项目,我想在程序代码中设置已编译DLL的版本。 这怎么可能? 谢谢你的帮助