_WIN32_WINNT定义在标题中更改,这是否会导致二进制不兼容?

时间:2015-01-20 18:14:09

标签: c++ windows visual-studio-2010 visual-studio binary-compatibility

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

如果这被修改,可能存在二进制不兼容或这是一个无关紧要的变化?我是否必须从库中请求新的二进制文件,将其定义为0x500?我不知道如何判断这是否需要新的分区 - 我认为如果任何类/结构的大小或命名发生变化,或者任何方法/函数签名发生变化,则需要进行新的编译。

1 个答案:

答案 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类型或指向此类型的指针,并且这些类型在0x5000x501之间扩展,< em>然后事情将会爆炸。令人高兴的是,我不希望有很多这样的结构,因为版本范围很窄。然而,如果这是一个担心,那么你肯定会要求新的二进制文件,因为解决这个问题会很困难,也很繁琐,有很多机会犯错误。

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