ターミナル サービスが実行されているかどうかを検出しようとしています。MSDN Wayを使用しようとしました:
OSVERSIONINFOEX osVersionInfo;
DWORDLONG dwlConditionMask = 0;
memset( &osVersionInfo, 0, sizeof( osVersionInfo ) );
osVersionInfo.dwOSVersionInfoSize = sizeof( osVersionInfo );
osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL;
VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND );
return VerifyVersionInfo( &osVersionInfo, VER_SUITENAME, dwlConditionMask );
うまく機能しますが、次の場合:
OS Name: Microsoft(R) Windows(R) Server 2003, Enterprise Edition
OS Version: 5.2.3790 Service Pack 2 Build 3790
OS Manufacturer: Microsoft Corporation
OS Configuration: Standalone Server
OS Build Type: Multiprocessor Free
ターミナル サービスの役割がない場合、 への呼び出しはVerifyVersionInfo
ゼロ以外の値を返します。これは、「現在実行中のオペレーティング システムが指定された要件を満たしている」か、関数が失敗したことを意味します。
GetLastError
戻り値:
0x000000cb "The system could not find the environment option that was entered."
Windows XP SP3 では、 を呼び出すとVerifyVersionInfo
0 の値が返されるため、入力エラーは発生しないと思います。
この動作をどのように処理しますか? これをターミナル サービスがないものとして扱ってよいでしょうか。より良いテクニックはありますか?
OSのバグですか?
アップデート:
Windows Server 2008 R1 の動作も同様です (失敗します)。他の多くのシステムにもある可能性があります。