DLL是否正确加载,你的断点位置是否正确

解决方案 »

  1.   

    没啥两样。断点都设在开头,都是按F5。
    他的程序就停在DllMain的入口处,我的程序就停在另一个函数的return处。
      

  2.   

    没啥两样。断点都设在开头,都是按F5。
    他的程序就停在DllMain的入口处,我的程序就停在另一个函数的return处。
    程序rebuild一下,再加载试试
      

  3.   

    你写的那个dll被其他地方调用了吗?
      

  4.   

    Windows 核心编程,关于LoadLibraryEx中的第3个参数dwFlags的说明:
      

  5.   

    没啥两样。断点都设在开头,都是按F5。
    他的程序就停在DllMain的入口处,我的程序就停在另一个函数的return处。
    程序rebuild一下,再加载试试
    啥叫“加载”?
      

  6.   

    是不是你的dll没有拷贝到调用该dll的exe的目录中???
      

  7.   

    现在把问题简化,希望大家踊跃发言:
    我的改动太大了,到底哪里出错很难查出。现在把问题简单化:
    不合并文件。只在原来的程序上改动一点:把一个函数取消,把其中的代码移动到调用它的地方。
    实际上整个程序也只有这一个地方调用它,而且也只调用一次,根本不需要用函数调用的方式。
    原来调用它的地方就在程序的入口:DllMain一开始的地方,见图中划红线的地方:被调用的函数的功能是注册四个窗口类并建立4个窗口,其开头部分如下图:图中划红线的语句“WNDCLASSEX wc;”定义了一个结构变量,用于注册四个窗口类。
    由于是C语言不是C++,所以变量定义要移到函数开头,或者设为全局变量。
    可是我不论把它移到DllMain函数开头,还是把它移到函数之前作为全局变量,都会导致调试时不从DllMain入口,不理会断点,无法调试。请问是啥原因?难道我必须改回函数调用吗?
      

  8.   

    原来能正常调试的Dll也没有拷贝到调用该dll的exe的目录中,都能正常调试。
      

  9.   

    补充:
    1、由于取消函数RegisterIMEClass调用方式,改为直接执行其代码,因此这部分代码中的所有形参hInstance都用实参g_hInst取代。
    2、取消函数后,原来的函数申明也取消。上面10楼的图中没有取消,是个bug,但是我取消之后问题依然如故。
      

  10.   

    把这句废话改成g_hInst=hInstDLL;也不行。
    把这句话改成hInstDLL=hInstDLL;也不行。
    改成只有一个分号的空语句(连同后面的注释)倒是可以的。
      

  11.   

    你这个有可能是没有把Debug版的生成文件拷贝到system32目录中所致。
      

  12.   

    原先那个能正常从DllMain入口的程序也没有把Debug版的生成文件拷贝到system32目录中
      

  13.   

    这个问题,由于我对他的程序改动太大,很难找出问题在哪里。
    因此我慢慢来,先改一点点,看看行不行。结果一点点都不允许改,哪怕加一句废话都会造成不能调试。详情参阅:http://bbs.csdn.net/topics/390898214?page=1#post-398283277