【问题标题】:Load function at runtime in C++在 C++ 中运行时加载函数
【发布时间】:2011-03-07 10:08:21
【问题描述】:

我有以下问题:

我的程序应该在运行时决定是否加载函数(在本例中为 GetExtendedTcpTable()),因为该方法在 Windows 2000 中不可用!? (仅在 Windows 2000 下无法启动该软件)

感谢您的帮助!

问候 leon22

【问题讨论】:

  • 以及为什么您希望它在运行时加载而不是以正常方式加载?
  • @fazo:正如 OP 所说,因为它在某些操作系统版本上不可用。

标签: c++ loadlibrary dynamic-binding


【解决方案1】:

您没有完全说明您的问题,但我想您想根据操作系统版本动态加载函数。

要确定操作系统版本,您可以使用GetVersionEx。要动态加载函数,首先使用LoadLibrary 检索其DLL 的模块句柄,然后使用GetProcAddress 检索指向该函数的函数指针。您需要将该函数指针转换为正确的原型。

【讨论】:

  • 我会省略 GetVersionEx 检查。只需使用 LoadLibrary 和 GetProcAddress。如果该功能存在,请使用它(如果它不存在,请不要使用它:-))。如果您使用 GetVersionEx,如果服务包决定在之后添加该功能,您会遇到问题。
  • @Patrick:是的,这可能是个好主意。但是,在某些情况下,您希望确保操作系统版本符合您的预期,或者至少比您已知的某个版本更新。
  • 好的,我这样做了,但是当我显式加载 lib 时,VS2008 中出现缓冲区溢出!?我该如何解决这个问题?
  • 不看你做了什么很难说。我建议你开始一个新问题。
  • 我也尝试过在 VS2008 中对延迟加载 DLL 的链接器支持,但我收到链接器警告:LINK : warning LNK4199: /DELAYLOAD:iphlpapi.dll 被忽略;没有从 iphlpapi.dll 中找到导入,但我需要一个来自 iphlpapi 的函数,并在此警告后得到一个链接器错误-> 很奇怪! ;-)
【解决方案2】:

如果该函数在特定平台上不可用,您希望在编译时确定是否在运行时不加载它。在构建的配置过程中,您确定该功能是否可用并正确编译。

【讨论】:

  • 我完全不同意。使您的软件在某些操作系统上正常运行,但没有某些功能是一件好事。对于用户来说,它比:“如果你有 windows xp 下载这个,如果 2000 下载那个......”等等。
  • @Kamil 我不能,因为我不熟悉 Windows。但是,如果平台无法提供足够的工具来正确完成工作,那并不会改变问题的正确解决方案。它只是表明平台无法正常工作。
  • 取出函数指针以保持与 Windows 以前版本的兼容性的解决方案很常见。就像我说的,当软件的其他功能运行良好时,只有一个功能不可用,比如在 Windows XP 上。如果唯一的区别是这个小功能,那么放弃与这个版本的操作系统的兼容性,或者为它制作特殊的包是没有意义的。另一种方法是将其制作为插件,但通常不值得为您自己的应用程序制作 pluginapi 只是为了一个功能
  • @Kamil 平台无法实现正确的解决方案(即编译时确定)不会改变解决方案的正确性。变通方法是一种技巧。平台能力的运行时评估过于臃肿。
  • 它在编译时执行,但在旧平台上,在运行时它不会解决依赖关系并且无法启动。您最后的评论也证明,您甚至不知道这种解决方案的目的是什么
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多