VC++ 2015 も Windows 2000で実行するとクラッシュするギミックが盛られる

vc2015

Visual C++ 2015 RC と VC++ 2013 Update 5を試してみましたが、両方とも PPL を使用すると Windows 2000で実行するとクラッシュするようです(Win7などで互換モードを試すとクラッシュします)


   void ResourceManager::RetrieveSystemVersionInformation()
    {
        // Determine the OS version
#if     (defined(_ONECORE) || defined(_KERNELX))
        // MSDK and _KERNELX support is in Windows 8 (or later)
        s_version = ::Concurrency::IResourceManager::Win8OrLater;
#elif   (defined(_M_IX86) || defined(_M_X64))
        OSVERSIONINFOW osvi;
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);

// Fix for warnings as errors when building against WinBlue build 9444.0.130614-1739
// warning C4996: 'GetVersionExW': was declared deprecated
// externalapis\windows\8.1\sdk\inc\sysinfoapi.h(442)
// Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
#pragma warning( disable : 4996 )
        if( !GetVersionExW(&osvi))
        {
            throw ::Concurrency::unsupported_os();
        }
#pragma warning( default : 4996 )

        switch (osvi.dwMajorVersion)
        {
        case 5:
            switch (osvi.dwMinorVersion)
            {
            case 2: // Win2k3 or XP-64
                s_version = ::Concurrency::IResourceManager::Win2k3;
                break;
            case 1: // XP
                s_version = ::Concurrency::IResourceManager::XP;
                break;
            case 0: // Win2k -- unsupported
                s_version = ::Concurrency::IResourceManager::UnsupportedOS;
                throw ::Concurrency::unsupported_os();
                break;

            }
            break;
        case 6: // Vista
            switch (osvi.dwMinorVersion)
            {
            case 0:
                s_version = ::Concurrency::IResourceManager::Vista;
                break;
            case 1:
                s_version = ::Concurrency::IResourceManager::Win7OrLater;
                break;
            default:
                s_version = ::Concurrency::IResourceManager::Win8OrLater;
                break;
            }
            break;

        default:
            s_version = ::Concurrency::IResourceManager::Win8OrLater;
            break;
        }
#else   // !(defined(_M_IX86) || defined(_M_X64))
        s_version = ::Concurrency::IResourceManager::Win8OrLater;
#endif  // !(defined(_M_IX86) || defined(_M_X64))

        // Initialize other information based on the OS version

該当するライブラリは concrt140.dll および、libconcrt.lib /libconcrt1.lib

Windows 2000で動くアプリが VC++2015 で作れるならまだ意味がわかりますが、
動かないのに、Windows 7や 8で 互換モードで動かしたらクラッシュするとか意味がわかりません
|・ω・) 。o ( 改造版 Windows 2000への嫌がらせなのか? )

ちなみに、XPだと判定されると Core 変数がNULLになって affinity が役割を持たなくなるようです。
2003と処理が違うんですね?

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です