把函数调用改为直接执行其代码,为何导致不能调试?
我把别人的一个能够正常调试的Dll程序拿来修改。只修改一项:取消一个函数的调用。不调用了,直接执行其代码。这个函数叫做RegisterIMEClass,它的功能是注册四个窗口类并建立4个窗口。
由于整个程序(由多文件组成)只有一个地方调用此函数,因此我觉得没有必要采用调用函数的方式,就把函数里的程序段直接代替原来的调用函数语句。
调用此函数的语句在Dll程序的入口函数DllMain的开头,见下图中划红线的语句:
被调用的函数参见下图:
取消调用方式了,就把该程序段中的形参hInstance都用实参g_hInst取代。
此外也取消函数申明。
原函数中的第一句(划红线的那句)“WNDCLASSEX wc;”定义了一个结构变量。
按规定,C语言的变量定义要放在函数开头,或者放到所有函数的前面作为全局变量。因此我把这条语句上移。
结果程序变成这样:
这个程序是个汉字输入方法,是个Dll,需要有个调用它的应用程序,一般选择记事本程序NOTEPAD.EXE来调试输入法Dll。
调试那个别人的程序时很正常:按F5以后记事本窗口跳出,选择此输入法后记事本窗口隐退,VC++回到前台,程序就从DllMain进入,到断点停下。
可是我这个改动后的程序,选择输入法后记事本仍然占据前台不肯隐退。这时按字母键的话,字母就出现在记事本上。这样就就无法调试。
想调试的朋友,到此下载程序:
http://www.
下载其中的“初中阶段示范程序”、拼音码表
如果你的系统是XP,就把下载的词库文件py.txt拷贝到:\WINDOWS\system32
建一个文件夹,把初中阶段示范程序《输入法编程入门标准程序.rar 》拷进去双击它,会释放出很多文件和文件夹。把其中的文件夹“说明”中的imm.h覆盖你的VC++的旧版本。
然后进入:Build->set Active Configuration,选中:srf-Win32 Release 。
然后选noteped.exe来调试本Dll。
做法是:
Project->Settings->Debug->Executable for debug session
单击它下面右边的按钮,点击Browse...。对于windowsXP系统,它在C:\WINDOWS\NOTEPAD.EXE
设置好断点后,点击F5,VC就会打开记事本,在Windows的状态栏中选择“天下无敌”输入法,就可以像调试普通可执行程序一样调试这个输入法了。
[ 本帖最后由 tm1mc2 于 2014-9-28 11:20 编辑 ]