这两天没啥么事,心中又萌生了点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可以让窗口标题重画呢???
几个小时的时间就干这了...
就尝试用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可以让窗口标题重画呢???
几个小时的时间就干这了...