在VS2010中,我正在努力将应用程序更新到需要_WIN32_WINNT至少为0x501的第三方库的新版本,但另一个提供二进制共享库的第三方共享库将其定义为标题中的0x500包含在申请表中。
如果这被修改,可能存在二进制不兼容或这是一个无关紧要的变化?我是否必须从库中请求新的二进制文件,将其定义为0x500?我不知道如何判断这是否需要新的分区 - 我认为如果任何类/结构的大小或命名发生变化,或者任何方法/函数签名发生变化,则需要进行新的编译。
答案 0 :(得分:3)
简短的回答:可能不是,但是如果它确实你是一个非常好的泡菜。
答案很长:
_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类型或指向此类型的指针,并且这些类型在0x500
和0x501
之间扩展,< em>然后事情将会爆炸。令人高兴的是,我不希望有很多这样的结构,因为版本范围很窄。然而,如果这是一个担心,那么你肯定会要求新的二进制文件,因为解决这个问题会很困难,也很繁琐,有很多机会犯错误。
除此之外,我认为你(可能)安全。