2

(この質問では例として zlib を使用していますが、それに固有のものではありません。)

付属の MSVC プロジェクト ファイルを使用して、Windows で zlib をコンパイルしようとしています。Windows 8 SDK で VS2012 を使用していますが、ビルド マシンは Windows 7 です。

Zlib には次のコードが含まれています。

#ifdef IOWIN32_USING_WINRT_API
    if ((filename!=NULL) && (dwDesiredAccess != 0))
        hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
#else
    if ((filename!=NULL) && (dwDesiredAccess != 0))
        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
#endif

ここで、IOWIN32_USING_WINRT_API は次のように設定されます

#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define IOWIN32_USING_WINRT_API 1
#endif
#endif

WINAPI_FAMILY_PARTITION と WINAPI_PARTITION_APP は Windows 8 SDK (winapifamily.h) で定義されているため、zlib で CreateFile2 を使用するコードをコンパイルできるようになります。

zlib をコンパイルすることはできますが、CreateFile2 が見つからないため、zlib をロードしようとするアプリケーションはすべて失敗します。私のマシンは Windows 7 であり、その API は Windows 8 で導入されているためです。

サポートされているバージョンよりも低いバージョンの Windows で Windows SDK を使用したのはこれが初めてです。したがって、私の質問は次のとおりです。

zlib にパッチを適用して _WIN32_WINNT >= _WIN32_WINNT_WIN8 のチェックを最初の行に追加し、/D_WIN32_WINNT=_WIN32_WINNT_WIN7 を msbuild に渡す唯一の方法はありますか? つまり、Win7 をサポートするもの (/D を渡す) と Win8 をサポートするもの (/D を渡さない) の 2 つのバイナリ セットをビルドする必要があります。

Windows 7 と 8 の両方で動作し、Windows 8 で実行する場合に CreateFile2 コードパスを使用する共通のバイナリを持つ方法はありませんか? (その方法は GetProcAddress + 関数ポインターだと思います。他に何かありますか?)

4

4 に答える 4

4

を使用_WIN32_WINNTして、対象とする OS バージョンを選択できます。壊れているのはzlibチェックです。WINAPI_FAMILY_DESKTOP_APP含まれWINAPI_FAMILY_APPているため、チェックは常に成功します。次のように修正できます。

#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY_DESKTOP_APP, WINAPI_PARTITION_APP)
#define IOWIN32_USING_WINRT_API 1
#endif
#endif

詳細については、こちらを参照してください: http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3965645c-978c-4148-b32c-1853f7fd22b3

于 2013-06-14T16:26:51.473 に答える
2

これを行うには、少なくとも VS2012 用の Update 1 がインストールされている必要があります。これにより、Windows 7 SDK の削減バージョンにリンクする XP 用にコンパイルできるようになるためです。

一部のコードでこれを行い、XP、Windows 7、および Windows 8 と互換性があります。

詳細については、こちらの MSDN ブログを参照してください。

以下の重要な情報

msdn

于 2013-06-14T10:33:32.140 に答える
0

私の知る限り、唯一の方法はLoadLibrary()andを使用するGetProcAddress()ことです。これは、WIn7 (またはそれ以降) のネイティブ メッセージを処理する MFC ソースでも確認できます。

例:CWnd::OnGesture()%VCINSTALLDIR%atlmfc\src\mfc\wincore.cpp

于 2013-06-14T08:11:04.863 に答える