【问题标题】:Using different functions for Windows 7 and Windows 10 in dll在 dll 中为 Windows 7 和 Windows 10 使用不同的函数
【发布时间】:2021-03-13 09:21:29
【问题描述】:

我创建了动态库(dll),它使用来自 Windows API 的函数 GetScaleFactorForMonitor。然而这个功能是在 Windows 8.1 中引入的,这些 dll 显然不会在 Windows 7 中加载。我正在考虑在一个dll中拥有相同方法的两个版本并根据Windows版本使用的解决方案。

有没有人有什么建议。我会在我的代码中保留GetScaleFactorForMonitor

【问题讨论】:

  • 如果您使用静态链接,您的应用很可能会在 Windows 7 上显示错误消息,因为它无法找到该 API 和/或 dll。因此,您很可能必须通过检测操作系统版本来对该 API 使用动态链接,然后使用 GetProcAdddress 来获取该 API 的地址。
  • @Asesh 或使用链接器的延迟加载功能(如果有)。这将在运行时为您包装 GetProcAddress() 逻辑。
  • @ase 在发现功能时不要检查操作系统版本。只需使用您选择的任何运行时动态链接方案来发现功能。

标签: c++ windows winapi dll


【解决方案1】:

你基本上需要这样的东西:

typedef HRESULT CALLBACK GETSCALEFACTORFORMONITOR(HMONITOR hMon, DEVICE_SCALE_FACTOR* pScale);

...

HMODULE hm = LoadLibrary("Shcore.dll");     // GetScaleFactorForMonitor is here

GETSCALEFACTORFORMONITOR* pGETSCALEFACTORFORMONITOR = NULL;

if (hm)
{
  pGETSCALEFACTORFORMONITOR = (GETSCALEFACTORFORMONITOR*)GetProcAddress(hm, "GetScaleFactorForMonitor");
}

if (pGETSCALEFACTORFORMONITOR)
{ 
  // GetScaleFactorForMonitor exists, call it like this:
  HRESULT hr = (*pGETSCALEFACTORFORMONITOR)(whatever parameters);   // call GetScaleFactorForMonitor
  // instead of like this:
  // HRESULT hr = GetScaleFactorForMonitor(whatever parameters);
}
else
{
  // GetScaleFactorForMonitor not available
  ...
}

您可能想根据自己的需要重新安排它,但您应该明白这一点。

【讨论】:

  • 你真的不需要haveGetScaleFactorForMonitor,你可以简单地检查pGETSCALEFACTORFORMONITOR是否为NULL
  • @RemyLebeau 我稍微简化了代码,谢谢
  • 谢谢这对我有用。我只是用 typedef int (*GetScaleFactor)(HMONITOR hMonitor, DEVICE_SCALE_FACTOR *nScaleFactor); 替换第一行
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 2012-02-15
  • 2016-07-16
  • 2017-08-20
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多