我在合规方案中使用了一个DLL(其细节无关紧要)。重要的一点是主可执行文件必须显示DLL版本号。我的解决方案是DLL有一个函数来返回它自己的版本 - 即从它自己的版本资源获取它并将其作为字符串返回。
我的评论员说主程序应该计算出DLL的版本号。他甚至给了我一些代码来获取DLL模块并使用它来提取版本。
我的问题是,这是一个更好的设计,为什么?我的感觉是,使用OO原则,我应该问DLL的版本号。以另一种方式执行意味着主程序需要知道如何存储版本信息,因此更紧密地耦合到实现。
请注意,我确切知道如何从DLL中提取版本信息。我的问题是代码的最佳位置。
答案 0 :(得分:2)
您能澄清一下您所处的环境吗?现在,既然你已经提到过获取模块句柄,我会假设你正在使用C ++并调用少数Win32函数之一(GetModuleHandle,LoadLibrary等)。
首先,我要小心在过于宽泛的背景下应用OO原则。面向对象的范例可以帮助您以更易于维护和可理解的方式构建软件,您所描述的问题听起来似乎可能超出了应用程序的范围。如果要获取有关单独资源(如DLL)的信息,则应考虑使用标准方法来实现此目的,以确保代码与需要检查的项目分离。
如果您在DLL中引入一个函数以将版本号返回到主应用程序,那么您已经在主应用程序和需要提供其版本信息的任何DLL之间建立了紧密耦合(通过实质上定义一个定制的API或接口)为此)。
您应该考虑使用标准的,平台范围的功能来检索信息。这将允许您的应用程序对可以获取句柄的任何DLL进行版本化。
假设您有一个用于dll的HMODULE(并且您正在使用C ++),请调用以下函数以获取该版本...
GetModuleFileNameEx(如果您还不知道,请获取DLL的完整路径和文件名) http://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85).aspx
使用此文件名,请致电
GetFileVersionInfoSize(在MSDN上查看这些内容)
这将告诉您一些关于文件版本元数据的重要信息(如果文件有多少信息)。假设此功能成功,请调用
GetFileVersionInfo
这会将所有文件信息元数据加载到缓冲区中,然后调用
VerQueryValue
提供'\'作为lpSubBlock参数以获取标准文件信息元数据(包括版本号)
上述函数将允许您编写代码以获取代码可以处理的任何模块的版本号。
当然,如果您使用C#,解决方案会更简单。希望这会有所帮助...