1、問題描述
原開發環境:Win7 64位旗艦版,VS2010,ThinkPad T460
出現問題:自己開發的MFC程序在WinXP環境下無法正常運行,彈框“無法定位程序輸入點InitializeConditionVariable於動態鏈接庫kernel32.dll”
重新搭建開發環境:WinXP SP3 專業版,VS2010,GIGABYTE某motherboard(原諒辦公室沒別的空閑主機了)
問題依舊存在:重新編譯通過,但運行時還是彈框“無法定位程序輸入點InitializeConditionVariable於動態鏈接庫kernel32.dll”,我在程序入口下的斷點,都沒有執行到。
2、原因
(1)如果並不是自己開發的程序:一般就是不兼容,但也有可能是別的原因。
(2)如果想讓自己開發的程序在WinXP系統上兼容:不要低估微軟,更不要高估寄幾。一般沒有別的亂七八糟的原因,只是因為WinXP系統的kernel32.dll中並沒有InitializeConditionVariable。之前在Win7上開發的時候,你或者MFC程序調用了kernel32.dll中的InitializeConditionVariable,所以在XP上根本運行不了。一般是多線程處理不當造成的。
3、解決方法
(1)如果並不是自己開發的程序:想要嘗試解決的話,請參照百度出來的方法,但是一定要提前准備好WinPE系統(U盤啟動盤),並且對原kernel32.dll文件進行備份!因為替換kernel32.dll文件極有可能使你的操作系統開不開機。
(2)如果想讓自己開發的程序在WinXP系統上兼容:
- 最好在WinXP上搭建開發環境,再調試代碼。
- 最好直接Google,中文資料質量一般。不要問我怎么知道的o(≧口≦)o
- 雖然只有兩個答案,但都是精華。 參考鏈接:http://stackoverflow.com/questions/2847960/procedure-entry-point-initializeconditionvariable-could-not-be-located-in-kernel
- 高票回答中的代碼可能並不能解決問題,第二個答案中,答主貼了自己的一篇博客 希望對你萌有所啟發,反正是啟發到我了(∩_∩)
- 對於我的程序,我定位到出問題的地方是托盤,托盤涉及到的東西比較底層。現在我把托盤功能注釋后可以再WinXP上運行了,接下來看看能否對托盤進行兼容處理,使之在XP上也能運行。
4、后續
WinXP是支持托盤圖標的,之所以出錯,是因為NOTIFYICONDATA結構也是不斷更新升級的。原實現托盤的代碼如下:
1 //設置托盤圖標 2 m_notify.cbSize=sizeof NOTIFYICONDATA; 3 m_notify.hWnd=this->m_hWnd; 4 m_notify.uID=IDR_MAINFRAME; 5 m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); 6 strcpy(m_notify.szTip,"XML解析程序"); 7 m_notify.uCallbackMessage=WM_USER_NOTIFYICON; 8 m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //生成托盤 9 Shell_NotifyIcon(NIM_ADD,&m_notify);
其中第二行 cbSize的賦值在WinXP環境下應改為:
m_notify.cbSize=sizeof NOTIFYICONDATA_V3_SIZE;
具體原因,參考:http://blog.csdn.net/kvs112219/article/details/6069936
以上。