VS2010+WinXP+MFC程序 無法定位程序輸入點於動態鏈接庫


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

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM