[問題] 讓vs編譯出來的MFC視窗程式也可以在Windows XP下執行

看板C_and_CPP (C/C++)作者 (red whale)時間9年前 (2016/10/13 17:09), 9年前編輯推噓1(1021)
留言22則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Win10 編譯器、IDE:Visual Studio 2015 問題(Question):  各位好  我想讓VS編譯出來的MFC視窗程式也可以在Windows XP下執行  如果我以預設的方式編譯出一個MFC視窗程式  拿去XP下執行會跳出一個方框:「不是正確的win32」  於是我上網找了一下解法  只要在專案上按一下右鍵,  點選屬性,  並找到「鏈接器->系統->最低版本」鍵入「5.01」  就可以解決(?)  我是參考這個的:http://bbs.csdn.net/topics/390639155  結果還是沒成功,  反而出現了另一個方框:「無法找到程序輸入點 InitializeCriticalSectionEx (在動態連結程式庫 kernel32.dll)  這該怎麼解決?  問題好像越來越複雜了… 預期的正確結果(Expected Output): 在Windows XP下可以正常開啟並執行 錯誤結果(Wrong Output): 無法找到程序輸入點 InitializeCriticalSectionEx (在動態連結程式庫 kernel32.dll) 補充說明(Supplement): -- 歡迎各位使用以下網站服務: http://redwh.al/ (短網址服務) http://i.redwh.al/ (圖片即時上傳服務) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.44.14.194 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1476349785.A.3AC.html

10/13 17:14, , 1F
最簡單的方法是:在虛擬機器裡裝 XP 和 compiler
10/13 17:14, 1F

10/13 17:14, , 2F
然後在裡面編譯
10/13 17:14, 2F
現在VS好像不支援Windows XP了… ※ 編輯: red0whale (114.44.14.194), 10/13/2016 17:17:06

10/13 17:17, , 3F
https://goo.gl/Hu76ja (MSDN連結) 這頁看一下
10/13 17:17, 3F

10/13 17:21, , 4F
你既然想在XP上面跑就得配合刪掉一些XP上不存在的東西
10/13 17:21, 4F

10/13 17:22, , 5F
像 InitializeCriticalSectionEx() 函式就是一個例子
10/13 17:22, 5F
不好意思, 請問這個函數怎麼刪除? 要刪好像蠻複雜的… 還有我是新手請多包含 謝謝 ※ 編輯: red0whale (114.44.14.194), 10/13/2016 17:28:37

10/13 17:29, , 6F
https://goo.gl/JZLVKE (MSDN連結) 這一頁也看一下
10/13 17:29, 6F

10/13 17:29, , 7F
我只用過 VS2012 沒用過 VS2015,沒辦法幫你試
10/13 17:29, 7F

10/13 17:30, , 8F
不過原則上就是照 MSDN 說的應該可以
10/13 17:30, 8F

10/13 17:31, , 9F
那個函數應該是在 MFC library 裡面的
10/13 17:31, 9F

10/13 17:33, , 10F
目標機器設定正確時應該不會再使用到那個函式才對
10/13 17:33, 10F

10/13 17:34, , 11F
此外我有點好奇,你為什麼剛學就要碰這麼麻煩的相容問題
10/13 17:34, 11F
啊… 忘記跟你講了 我如果將「平台工具組(Platform Toolset)」設成「Visual Studio 2015 – Windows XP (v140_xp)」的話 編譯會出現一堆「未定義」等的錯誤 所以我選的是「Visual Studio 2015 (v140)」 不然選別的都會編譯錯誤 ※ 編輯: red0whale (114.44.14.194), 10/13/2016 17:42:04

10/13 18:04, , 12F
出現未定義那表示 XP 沒有這些東西
10/13 18:04, 12F

10/13 18:05, , 13F
所以你要照我的第一個連結 define 那些東西
10/13 18:05, 13F

10/13 18:06, , 14F
header 裡面才會把不該出現的部份排除
10/13 18:06, 14F

10/13 18:06, , 15F
通常 MFC 專案是把定義寫在 stdafx.h 裡面即可
10/13 18:06, 15F

10/13 18:07, , 16F
要寫在所有的 #include 前面才會生效
10/13 18:07, 16F
嗯… 還是一樣 以下是我的主程式Source: (main.cpp) #define NTDDI_VERSION 0x05010000 //設成Windows XP #define _WIN32_WINNT 0x0501 //設成Windows XP #include <afxwin.h> class MyAPP : public CWinApp { public: BOOL InitInstance() { CFrameWnd *Frame = new CFrameWnd(); m_pMainWnd = Frame; Frame->Create(NULL, "Hello MFC"); Frame->ShowWindow(SW_SHOW); return true; } }; MyAPP a_app; 我想印出一個標題為「Hello MFC」的空白視窗 按照您說的第一個連結的define 我把它們的值設成表中的Windows XP 但似乎無效 編譯結果還是出現一堆「未定義」的錯誤 縱使我已經把「平台工具組(Platform Toolset)」設成「Visual Studio 2015 – Windows XP (v140_xp)」了 ※ 編輯: red0whale (114.44.14.194), 10/13/2016 18:47:47 剛才試了一下,問題好像解決了 非常感謝您!! ※ 編輯: red0whale (114.44.14.194), 10/13/2016 18:50:59

10/13 19:08, , 17F
忘了說改完 define 要清除整個專案重新編譯 @@
10/13 19:08, 17F

10/14 01:53, , 18F
有問題的解法希望可以不吝分享
10/14 01:53, 18F

10/15 04:46, , 19F
3
10/15 04:46, 19F

10/16 00:05, , 20F
非得用 VS2015 的 compiler 嗎 ? 若還要相容 XP 的話 ,
10/16 00:05, 20F

10/16 00:05, , 21F
我比較建議在 VS2015 下,設定以 2010 方式做 compile
10/16 00:05, 21F

10/16 00:05, , 22F
( 這點是辦得到的唷 , 2015 就真的只變 IDE 而已了 )
10/16 00:05, 22F
文章代碼(AID): #1N_qzPEi (C_and_CPP)
文章代碼(AID): #1N_qzPEi (C_and_CPP)