我有一个用于合规性场景的 DLL(其细节无关紧要)。重要的一点是主要可执行文件必须显示 DLL 版本号。我的解决方案是 DLL 有一个函数来返回它自己的版本 - 即从它自己的版本资源中获取它并将它作为字符串返回。
我的评论者说主程序应该计算出 DLL 版本号。他甚至给了我一些代码来获取 DLL 模块句柄并使用它提取版本。
我的问题是,哪个设计更好,为什么?我的感觉是,使用 OO 原则,我应该向 DLL 询问其版本号。换一种方式意味着主程序需要知道版本信息是如何存储的,因此与实现更紧密地耦合。
请注意,我确切地知道如何从 DLL 中提取版本信息。我的问题是关于执行此操作的代码的最佳位置。
最佳答案
您能说明一下您的工作环境吗?现在,由于您已经提到获取模块句柄,我假设您正在使用 C++ 并调用少数 Win32 函数之一(GetModuleHandle、LoadLibrary 等)。
首先,我会小心谨慎地在过于广泛的上下文中应用 OO 原则。面向对象范式可帮助您以更易于维护和理解的方式构建软件,您所描述的问题听起来可能超出了应用程序的范围。如果您想获取有关单独资源(例如 DLL)的信息,您应该考虑使用标准方法来实现这一点,以确保您的代码与其需要检查的项目分离。
如果您在 DLL 中引入一个函数以将版本号返回给您的主应用程序,那么您已经在您的主应用程序和任何需要提供其版本信息的 DLL 之间创建了一个紧密耦合(通过本质上定义一个定制的 API 或接口(interface)为此)。
您应该考虑改用标准的、平台范围的功能来检索信息。这将允许您的应用程序对它可以获得句柄的任何 DLL 进行版本控制。
假设您有一个用于 dll 的 HMODULE(并且您使用的是 C++),请调用以下函数来获取版本...
GetModuleFileNameEx(获取 DLL 的完整路径和文件名,如果您还不知道的话) http://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85).aspx
使用这个文件名,调用
GetFileVersionInfoSize(在 MSDN 上查找)
这将告诉您有关文件版本元数据的一些重要信息(多少信息,如果文件有的话)。假设这个函数成功,调用
获取文件版本信息
这会将所有文件信息元数据加载到缓冲区中,然后调用
查询值
提供 '\' 作为 lpSubBlock 参数以获取标准文件信息元数据(包括版本号)
上述函数将允许您编写代码来获取您的代码可以处理的任何模块的版本号。
当然,如果您使用的是 C#,则解决方案会简单得多。希望这有助于...
关于windows - 软件设计 : how to get DLL version number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12297663/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,: