zoukankan      html  css  js  c++  java
  • 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

    以上。

  • 相关阅读:
    使用AsyncTask简单的文件遍历
    如何创建黑名单
    关于PopupMenu的用法
    联系人的搜索和添加
    php获取真实IP地址
    socket.io获取客户端的IP地址(修正官方1.0.4版本BUG)
    ubuntu下安装bind9
    install source nginx 1.6.0
    在Ubuntu下的samba实现
    买了新硬盘,给ESXI的虚拟机挂进真实硬盘。
  • 原文地址:https://www.cnblogs.com/JJJanepp/p/6346662.html
Copyright © 2011-2022 走看看