windows – ruby win32apistructs(VerQueryValue)
发布时间:2020-09-18 15:57:24 所属栏目:Windows 来源:互联网
导读:我试图使用 win32-api library调用标准的Win32 API函数来获取文件版本信息. 3 version.dll函数是GetFileVersionInfoSize,GetFileVersionInfo和VerQueryValue.然后我调用kernel32.dll中的RtlMoveMemory来获取VS_FIXEDFILEINFO结构的副本(请参阅Microsoft文档:
|
我试图使用 win32-api library调用标准的Win32 API函数来获取文件版本信息. 3 version.dll函数是GetFileVersionInfoSize,GetFileVersionInfo和VerQueryValue.然后我调用kernel32.dll中的RtlMoveMemory来获取VS_FIXEDFILEINFO结构的副本(请参阅Microsoft文档:http://msdn.microsoft.com/en-us/library/ms646997(VS.85).aspx). 我从使用VB看到的一个例子中得出:http://support.microsoft.com/kb/139491. 我的问题是最终返回的数据似乎与预期的结构不匹配,实际上它甚至没有返回一致的值.我怀疑数据在某些时候会被破坏,可能是在VerQueryValue或RtlMoveMemory中. 这是代码: GetFileVersionInfoSize = Win32::API.new('GetFileVersionInfoSize','PP','I','version.dll')
GetFileVersionInfo = Win32::API.new('GetFileVersionInfo','PIIP','version.dll')
VerQueryValue = Win32::API.new('VerQueryValue','PPPP','version.dll')
RtlMoveMemory = Win32::API.new('RtlMoveMemory','PPI','V','kernel32.dll')
buf = [0].pack('L')
version_size = GetFileVersionInfoSize.call(myfile + " ",buf)
raise Exception.new if version_size == 0 #TODO
version_info = 0.chr * version_size
version_ok = GetFileVersionInfo.call(file,version_size,version_info)
raise Exception.new if version_ok == 0 #TODO
addr = [0].pack('L')
size = [0].pack('L')
query_ok = VerQueryValue.call(version_info," ",addr,size)
raise Exception.new if query_ok == 0 #TODO
# note that at this point,size == 4 -- is that right?
fixed_info = Array.new(13,0).pack('L*')
RtlMoveMemory.call(fixed_info,fixed_info.length)
# fixed_info.unpack('L*') #=> seemingly random data,usually only the first two dwords' worth and the rest 0.
这是我工作的完整代码,以防其他人正在寻找这样的功能.
返回一个包含四个产品/文件版本号部分的数组(即,在dll文件属性窗口中称为“文件版本”): def file_version ref,options = {}
options = {:path => LIBDIR,:extension => 'dll'}.merge(options)
begin
file = File.join(ROOT,options[:path],"#{ref}.#{options[:extension]}").gsub(///,"")
buf = [0].pack('L')
version_size = GetFileVersionInfoSize.call(file + " ",buf)
raise Exception.new if version_size == 0 #TODO
version_info = 0.chr * version_size
version_ok = GetFileVersionInfo.call(file,version_info)
raise Exception.new if version_ok == 0 #TODO
addr = [0].pack('L')
size = [0].pack('L')
query_ok = VerQueryValue.call(version_info,size)
raise Exception.new if query_ok == 0 #TODO
fixed_info = Array.new(18,0).pack('LSSSSSSSSSSLLLLLLL')
RtlMoveMemory.call(fixed_info,addr.unpack('L')[0],fixed_info.length)
fixed_info.unpack('LSSSSSSSSSSLLLLLLL')[5..8].reverse
rescue
[]
end
end (编辑:长春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ui-automation – Microsoft UI Automation:调用模式异常
- 如何在Windows中使用golang获取文件描述(产品名称,原始filn
- windows-phone-7 – WP7政策检查
- 如何使用GUI独立于.NET或其他Libs为Windows制作便携式C程序
- 将PDF文件/对象插入Microsoft Excel时出现“无法插入对象”
- 带有ANSI代码的文本编辑器/查看器,支持Windows
- 将存储数据从一个Azure帐户复制到另一个
- windows-server-2008-r2 – Windows任务计划程序:由于超时
- Windows10环境下WDK开发使用IoCreateDeviceSecure无法解析的
- PB6.5编译的程序 如何在Win7 和 Win10系统上脱离PB开发环境
推荐文章
站长推荐
- 无法找到MSVCP120D.DLL或0x00007启动错误的解决方
- 何处下载适用于.NET 4.5的Microsoft Expression
- 批处理文件 – 以编程方式更改和刷新图标(无需重
- windows – 在gui中包装rsync进度的最佳方法?
- Shared Event-loop for Same-Origin Windows(译)
- windows下编译mxnet并使用C++训练模型
- 在Windows中运行/调试python程序的最简单的方法
- windows-8 – 如何在WinRT中将UI虚拟化应用于Scr
- windows编译和使用tesseract(C++ api)
- Windows上的64位版Octave
热点阅读
