gpt4 book ai didi

c++ - _WIN32_WINNT 定义在 header 中更改,这是否会导致二进制不兼容?

转载 作者:可可西里 更新时间:2023-11-01 11:28:21 25 4
gpt4 key购买 nike

在 VS2010 中,我正在努力将应用程序更新到第三方库的新版本,该库要求 _WIN32_WINNT 至少为 0x501,但另一个提供二进制共享库的第三方共享库在 header 中将其定义为 0x500包含在应用程序中。

如果修改了,是否会出现二进制不兼容或者这是一个无关紧要的更改?我是否必须从将其定义为 0x500 的库中请求新的二进制文件?我不确定如何判断这是否需要新的 bin——我认为如果任何类/结构的大小或命名发生变化,或者任何方法/函数签名发生变化,则需要进行新的编译。

最佳答案

简短的回答:可能不会,但如果是的话,那你就进退两难了。

长答案:

_WIN32_WINNT 控制您的代码将使用的 WinAPI(以及相关库,例如 MFC)的版本。目的是确保在您使用在您的目标 Windows 版本之后引入的 Windows 功能时生成编译器错误。

主要是控制哪些函数、结构等对您可见。这部分不会导致二进制不兼容,除非您不是针对的 Windows 版本。然而……

WinAPI 中有一些结构在 Windows 的整个生命周期中得到了扩展。例如,看一下 OPENFILENAME 的定义:

typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void *pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif
} OPENFILENAME, *LPOPENFILENAME;

看到最后一点了吗?这意味着潜在的麻烦——如果一个代码在 _WIN32_WINNT 设置为 0x400 的情况下进行编译,而另一个代码则假定该结构小于另一部分0x500

WinAPI 的设计者确实考虑过这个问题。您会注意到 OPENFILE 的第一个成员是 lStructSize;您应该使用 sizeof(OPENFILE) 对其进行初始化。对你来说,sizeof(OPENFILE) 是一个编译时常量,对于 Windows 运行时库中的函数,它是它们决定你使用哪个版本的 OPENSTRUCT 结构的标签重新传递给他们。

在一种情况下这意味着潜在的麻烦:如果二进制库和您的代码的其余部分交换 WinAPI 类型或指向此类类型的指针,并且如果这些类型在 0x5000x501 之间扩展然后事情就会爆炸。令人高兴的是,我不希望有很多这样的结构,因为版本范围很窄。但是,如果担心这一点,那么您绝对应该请求新的二进制文件,因为解决这个问题会很困难而且很乏味,而且有很多机会犯错误。

除此之外,我认为你(可能)是安全的。

关于c++ - _WIN32_WINNT 定义在 header 中更改,这是否会导致二进制不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28052362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com