簡體   English   中英

c ++ win32阻止應用程序在Windows XP上運行

[英]c++ win32 prevent application from running on windows xp

我開發了一個使用Vista(或更高版本)API的應用程序,如果應用程序檢測到不支持的操作系統,我想添加彈出消息。

我想在用戶在Windows XP上運行我的應用程序時添加一條彈出消息。 目前應用程序只是拋出一個彈出窗口(messageBox),說某些DLL無法加載。

我已經定義了這樣的windows版本:

 #define _WIN32_WINNT 0x0600

我該怎么做以防止在低於Vista的版本上運行? 我是否必須在應用程序啟動時檢查操作系統版本(並向用戶顯示消息)?

為了顯示彈出消息,您需要運行可執行文件。 這意味着您必須將Windows版本降低到您打算“支持”的最低版本(此處支持意味着能夠運行,並顯示彈出窗口表示它不會運行)。 如果您鏈接到相關的DLL,這將要求您延遲這一點,否則它們將無法找到,您仍然會得到您知道的相同消息框。

總而言之,這種方法存在許多缺點,因為您必須在XP和Vista上構建有效的可執行文件。 如果你真的需要這個檢查,那么你可以讓一個可執行文件執行它並決定是顯示彈出消息還是啟動你的實際應用程序(在不同的可執行文件中)。

如果您使用的是XP上不可用的API,則需要將應用程序分為加載程序和真實應用程序(或包含實際應用程序的加載程序和DLL)。 使用#define _WIN32WINNT 0x0501編譯加載程序,以確保它可以在XP上運行並顯示彈出窗口。

使用VerifyVersionInfoGetVersionEx檢查版本

您可以編寫一個非常小的包裝器應用程序,將_WIN32_WINNT定義為0x0501。 然后該程序可以執行操作系統檢查,並為您的用戶顯示一些不錯的UI(如果它是Windows的錯誤版本),或者只是安靜地啟動您的其他可執行文件(如果它是受支持的Windows版本)。

理想情況下,您的分發渠道(網站等)會在允許用戶下載之前檢查用戶是否擁有受支持的Windows版本。

如果您使用WiX(或MSI直接)來安裝您的應用程序,您可以讓安裝程序處理不支持的操作系統檢查。

如果強制執行靜態編譯時行為,則無法期望動態運行時行為。 您需要定義XP Windows版本,以便您的exe鏈接到XP DLL,然后在運行時,您需要動態更改行為並加載Vista DLL並“手動”找到入口點。 正如您所料,這是痛苦和容易出錯的。 祝好運。

您可以將_WIN32_WINNT定義為較低的值,適用於2000或XP。 但是,您將需要為僅Vista的API使用顯式鏈接。 更改_WIN32_WINNT也會導致僅Vista的API缺少類型聲明。 因此,如果您知道需要哪些API,可以將_WIN32_WINNT0x0600並對這些API使用顯式鏈接。 顯然,您還需要進行版本檢查才能向用戶發送有用的消息。

就個人而言,我會采取不同的方式解決這個問題。 我會在安裝時檢查版本並在那里阻止它。 這允許您繼續使用_WIN32_WINNT 0x0600以及提供的所有便利。

發生的事情是應用程序加載器正在加載DLL,您在應用程序啟動之前就會看到錯誤消息。 你需要防止這種情況發生。

您可以將應用程序放入DLL中,並創建一個存根程序,以執行操作系統檢查,如Mystical在其答案中所述。

編輯:

似乎Mystical刪除了他的答案......做這樣的事情:

OSVERSIONINFO OSversion;

OSversion.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
::GetVersionEx(&OSversion);

switch(OSversion.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
   if(OSversion.dwMajorVersion >= 6)
   {
      // Yay, load the DLL and call entry point
   }
default:
      // Show unsupported OS message
}

您可以調用LoadLibrary()來加載應用程序DLL,然后調用您定義的任何入口點。

請注意, 此答案有一個很酷的操作系統版本號列表。

我不知道如何在Visual Studio或其他編譯器中執行此操作,但在Borland / CodeGear / Embarcadero IDE中,可以選擇在已編譯的可執行文件的PE頭中設置支持的最低操作系統版本。 如果OS加載程序嘗試運行具有不兼容版本的可執行文件,則它將不會運行可執行文件,並將向用戶顯示有關版本不匹配的錯誤消息。 檢查您的編譯器/ IDE是否有類似的選項可用。

否則,您必須在運行時通過LoadLibrary() / GetModuleHandle()GetProcAddress()動態加載所需的API,而不是在編譯時靜態鏈接到它們。 然后,您可以在使用可能無法使用的較新API函數之前在代碼中執行自己的操作系統版本檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM