2010-08-09 12 views
5

क्या कोई सी ++ .NET फ़ंक्शन है जिसे मैं कॉल कर सकता हूं जो यह पता लगाएगा कि मेरा प्रोग्राम संगतता मोड में चल रहा है या नहीं? यदि कोई नहीं है, तो क्या कोई मुझे एक के लिए कोड दिखा सकता है? धन्यवाद।एक प्रोग्राम संगतता मोड में चल रहा है

उदाहरण के लिए:

कार्यक्रम अप लोड संगतता मोड की जांच अगर सच तो बाकी से बाहर निकलने को चलाने

+0

"संगतता" से आपका क्या मतलब है? – Klaim

+3

यदि आप अपने ऐप के लिए संगतता मोड अक्षम करते हैं तो सभी प्रकार के उपयोगकर्ता आपको नफरत करेंगे। आप ऐसा क्यों करना चाहते हो? –

+0

हाँ अक्षमता मोड अक्षम करना काफी प्रतिबंधित है –

उत्तर

8

एक और मंच

से कुछ गूगल खोजों के बाद व्यर्थ में चला गया, मैं खुद का प्रयोग करने का फैसला किया। मैंने पाया कि प्रत्येक निष्पादन योग्य के लिए सेटिंग्स संग्रहीत हैं - जैसा कि मैंने सोचा था कि यह विंडोज रजिस्ट्री में होगा।

कुंजी जहां सेटिंग्स जमा हो जाती है
HKEY_CURRENT_USER \ Software \ Microsoft \ विंडोज NT \ CurrentVersion है \ AppCompatFlags \ परतें

अपने अनुकूलता सेटिंग्स है कि प्रत्येक आवेदन के लिए निर्दिष्ट, वहाँ एक मूल्य मौजूद है उस कुंजी के तहत जिसका नाम निष्पादन योग्य का मार्ग है और डेटा एक स्ट्रिंग है जो संगतता सेटिंग्स शामिल है।

स्ट्रिंग कि अनुकूलता सेटिंग्स निर्दिष्ट में कीवर्ड हैं: Win95 WIN98 NT4SP5
WIN2000 256COLOR 640x480
DISABLETHEMES DISABLECICERO

एकाधिक सेटिंग निर्दिष्ट कर रहे हैं (या निर्दिष्ट किया जाना है), डेटा में प्रत्येक स्थान से अलग से ऊपर की सेटिंग्स शामिल हैं। पहले चार सेटिंग्स पारस्परिक रूप से अनन्य हैं, यानी उनमें से केवल एक ही निर्दिष्ट है (यदि बिल्कुल)। मेरे पास एकाधिक ऑपरेटिंग सिस्टम निर्दिष्ट करने के परिणामों का परीक्षण नहीं किया है।

तो, अपनी समस्या को हल करने के लिए वापस। यह जांचने के लिए एक निष्पादन योग्य (चलो कहते हैं, "C: \ पथ \ executable.exe"), नाम के एक मूल्य होगा 256 रंग मोड में रन पर सेट है "C: \ पथ \ executable.exe" कुंजी [HKEY_CURRENT_USER \ Software \ Microsoft \ विंडोज NT \ CurrentVersion \ AppCompatFlags \ परतें], के तहत और डेटा मान के साथ जुड़े (उद्धरण, भले ही पथ रिक्ति के बिना) स्ट्रिंग होता हैं, "256COLOR "। यदि यह विंडोज 98/ME के ​​तहत संगतता मोड में चलाने के लिए भी सेट है, तो डेटा "WIN98 256COLOR" होगा।

तो, दृष्टिकोण सरल है। परीक्षण करें यदि ऊपर उल्लिखित कुंजी I के तहत निष्पादन योग्य के पूर्ण पथ के साथ एक मान है।यदि नहीं है, तो निष्पादन योग्य को संगतता सेटिंग्स निर्दिष्ट नहीं किया गया है। यदि मान मौजूद है, तो डेटा में "256COLOR" की उपस्थिति के लिए अपना डेटा पुनर्प्राप्त करें और देखें। तदनुसार, "WIN95" या "WIN98" या "NT4SP5" या "WIN2000" का अर्थ यह होगा कि निष्पादन योग्य उस विशेष ऑपरेटिंग सिस्टम के लिए संगतता मोड में चलाने के लिए सेट है।

+1

कूल, लेकिन कोड में, मैं इन मानों में से किसी एक के लिए HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers कैसे जांचूं? धन्यवाद! – user409939

+0

रजिस्ट्री और रजिस्ट्रीकी कक्षाएं। .NET तरीके से विंडोज एपीआई तरीका करने के लिए संकल्पनात्मक रूप से वही है। –

2

आपरेशन प्रणाली है कि GetVersionEx से लौटे है संस्करण प्राप्त करें और फ़ाइल संस्करण के लिए यह kernel32.dll पर की तुलना करें। जब अनुप्रयोग संगतता मोड GetVersionEx में हमेशा ऑपरेटिंग सिस्टम का संस्करण वापस आ जाएगा जो 'emulated' है। यदि दोनों संस्करण अलग हैं तो आप एप्लिकेशन संगतता मोड में हैं।

1

उपरोक्त उत्तर में मुझे प्रश्न के लिए "समाधान" प्राप्त करने में मदद मिली। यह शायद सबसे सुरुचिपूर्ण नहीं है, लेकिन काम करने लगता है। जाहिर है आप रिटर्न प्रकार पर थोड़ा अधिक रचनात्मक हो सकते हैं। बूलियन यहां पर्याप्त नहीं है। मुझे लगता है कि एक देशी एपीआई अच्छा होगा।

typedef VOID (NTAPI* TRtlGetNtVersionNumbers)(LPDWORD pdwMajorVersion, LPDWORD pdwMinorVersion, LPDWORD pdwBuildNumber); 

bool IsRunningCompatMode() 
{ 
    TRtlGetNtVersionNumbers RtlGetNtVersionNumbers = (TRtlGetNtVersionNumbers)GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlGetNtVersionNumbers"); 

    assert(RtlGetNtVersionNumbers); 

    if(RtlGetNtVersionNumbers) 
    { 
     OSVERSIONINFO osInfo = {0}; 
     osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
     GetVersionEx(&osInfo); 

     DWORD dwMajorVersion; 
     DWORD dwMinorVersion; 
     DWORD dwBuildNumber; 

     RtlGetNtVersionNumbers(&dwMajorVersion, &dwMinorVersion, &dwBuildNumber); 

     dwBuildNumber &= 0x0000FFFF; 

     if(osInfo.dwBuildNumber != dwBuildNumber) 
     { 
      return true; 
     } 
    } 
    return false; 
}; 
संबंधित मुद्दे