C++ WIN32 NOMFC DLL 调试

    这两天没啥么事,心中又萌生了点C++念头。
    就尝试用C++写写动态链接库玩玩。才开始写时,还蛮简单的。也就是点导出
/导入参数约束。很容易就实现了。
    接下来,就是非MFC动态链接库中封装窗体。这下有点问题了,先前是在WINMAIN
函数中注册窗口类、创建窗口实例、消息循环、窗口过程。没办法只好把WINMAIN
函数拷贝过来改个名再调用。这样还有点问题,WINMAIN的参数从哪儿弄,我也不
晓得,只好把不急着用的全删掉。就这样捣弄着,嘿,窗体这真出来了。
    先别高兴太早...
    窗口是出来,可也还有问题(动态调用):
    1、在调用程序中,打开窗口可以,但再次打开时,却没了影儿。
    2、调用显示窗口后,先关闭主程序则报错。
    3、没法模态显示DLL中的窗口。
    这是为啥么子呢...
    问题1
        在WINMAIN中有这么一句:
        if (!RegisterClass( &wc ))    return (FALSE);
        第一次打开窗口,窗口类wc注册一次,生成实例,关闭窗口,释放动态链接
    库。
        第二次调用动态链接库。首先,装入DLL,调用接口函数,执行接口函数里
    中注册窗口...  第二次调用,就是执行到这个地方退出的。
        为什么呢,第一次调用后释放了DLL呀?第一次调用的DLL的确释放了。
    在DLLMAIN函数中DLL_PROCESS_DETACH:分支中的MESSAGE语句显示出来了。
        原因应该是DLL释放了,主程序未关闭过,窗口类wc并未随DLL的释放而销
    毁。在调用程序中,wc还可以用来生成窗口实例。
        解决:可惜API未提供UnRegister(可能写错了)函数。就只有在注册前
    判断wc是否已注册,(当然程序中不能有重名的,否则永远是错的)。

    问题2
        我试过静态调用,静态调用,这种情况不会报错。
        什么原因,我也不敢确定,可能是动态调用必须先关闭动态链接库,否则
    会导致指针出错。

    问题3
        要想实现到和其它语言一样,恐怕是件很难的事。
        本来想比较一个C++写的DLL(非模态)和DELPHI写的DLL(模态)反汇编之后的
    代码,试图从中发现点什么。结果我错了,反汇编之后的代码,好几百页,不是
    一时半会能发现了。再说我第一次用反汇编,那是难上加难呀。

        主要就是屏蔽消息,只是思想,做其来可就不这么容易了。
        要对每一个窗口,重写其窗口过程。窗口不仅仅是主窗体,窗体中的控件
    如按钮、列表框、下拉框等。
        屏蔽消息,所有的消息都屏蔽,这样会花屏。所以像WM_PANIT是不能屏蔽
    的。那该保留哪些消息呢?我也不知道。
   
        今天,我保留了一些消息,但主程序的标题却没了,在关闭DLL窗体后,
    还是没恢复正常。当标题被覆盖之后,就能恢复正常。在网上搜了几个来回,
    试了一切可能消息(包括WM_SETTEXT),结果还是没显示出来。
        没办只有把窗体得到的消息,全打出来。打出来的是十进制,还得转换成
    十六进制,然后再到windows头文件中去找对应的消息。
        在这儿只列出最后一段:
        Here is a number: 132
    Here is a number: 32
    Here is a number: 160
    Here is a number: 132
    Here is a number: 32  WVR_ALIGNLEFT
    Here is a number: 161 WM_NCLBUTTONDOWN
    Here is a number: 533 WM_CAPTURECHANGED
    Here is a number: 274 WM_SYSCOMMAND
    Here is a number: 16  WM_CLOSE
    Here is a number: 70  WM_WINDOWPOSCHANGING
    Here is a number: 71  WM_WINDOWPOSCHANGED
    Here is a number: 134 WM_NCACTIVATE
    Here is a number: 6   WM_ACTIVATE
    Here is a number: 28  WM_ACTIVATEAPP
    Here is a number: 8   WM_KILLFOCUS
    Here is a number: 641 WM_IME_SETCONTEXT
    Here is a number: 642 WM_IME_NOTIFY
    Here is a number: 2   WM_DESTROY
    Here is a number: 130 WM_NCDESTROY
        从这上面找那个叫难呀...

        反正是标题吗,我来看看重设标题能显示出来吗。在关闭DLL后,重设标题成
    功。我似乎感到我要找的消息,已经离我很近了。
        查看重设窗体标题所产生的消息:
    Here is a number: 13
    Here is a number: 20
    Here is a number: 133
    Here is a number: 13
    Here is a number: 20
    Here is a number: 134
   
    Here is a number: 12
    Here is a number: 13
    ///
    Here is a number: 15
    Here is a number: 309
    Here is a number: 132
    Here is a number: 32
    Here is a number: 160
    Here is a number: 132
        中间用斜杠隔开的就是重设标题的消息代码。
        12是WM_SETTEXT,
        13是WM_GETTEXT。
        结果在未屏蔽的消息中添加WM_GETTEXT,主程序窗口标题,还真显示出来了。
       
    谁又能想到WM_GETTEXT可以让窗口标题重画呢???
    几个小时的时间就干这了...
       
   
   
   
   

   

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值