Programming 版 (精华区)

发信人: Sun (大灯泡), 信区: Programming
标  题: [转载] 讨论]VXD与WIN32APP通讯      
发信站: 紫 丁 香 (Thu Sep  9 10:41:09 1999), 转信

【 以下文字转载自 VisualProgram 讨论区 】
【 原文由 xiaojun 所发表 】

主题: [讨论]VXD与WIN32APP通讯                kingchurch (转寄)
日期: 1998年9月19日 07:31:29
发件人: lyj.bbs@bbs.net.tsinghua.edu.cn
收件人: lyj@hs1.hit.edu.cn

发信人: pdhomer (小东子), 信区: Programming


我试了以下笨笨兄上次给的VXD的例程

想把它改到32位,我把当中的register都

改成了Exx,(不知这样是否正确)

其它的都没问题,唯有这一条

move edx, offset PostMessage

提示的错误是:operand size conflict

如果改回:

mov dx, offset PostMessage

则提示有两个以上同样的错误。

不知何故



发信人: suxm (笨笨), 信区: Programming

很高兴看到你关于VXD的思考。就这样一点一滴的思考最终会
导致质的飞跃。

我以前那个例子,只是最最最最简单的一个VXD与WINAPP16的
通信。什么安全性都没有考虑,如果你把那个例子编译之后运
运,能成功,则算你走运,不能成功,也很正常。
我先假设你运行成功了。现在回答你的问题,怎样把它改成
WIN32APP能用的形式。(我在这里所说的WIN32APP都是指在
WIN95下的WIN32APP)。
VXD如果想给WIN32app进行PostMessage(),那就不用这样
麻烦,你的做法纯粹是画蛇添手。根本用不着把WINAPP的
PostMessage()的地址传给VXD。只用一个服务就可以替代
那许多的东东,比如说那一大堆Simulate_Push,根本用不着了。
那个我们必须而且只须用到的服务就是_SHELL_PostMessage()。
(你看,WIN95还是给我们带来了一些好处的) 。

好了,把一开始说的话接上。以前的例子不安全的原因如下:
还记得我在前面的一篇章中讲过System VM与V86 VM的概念吧。
所有的WINAPP都运行在System VM中,所有的DOSAPP都运行
在V86 VM中。现在这个概念就起作用了。
假设一下,如果当前的VM不是System VM,而是某个V86 VM。
那么你的VXD的PostMessage就会失败。
所以安全的法子是,Call_Priority_VM_Event(),然后再PostMessage() 。
至于细节嘛,你先自己钻研一下,待你有了一些新的实践之后
再作探讨吧。


【 在 pdhomer (小东子) 的大作中提到: 】
: 我试了以下笨笨兄上次给的VXD的例程
: 想把它改到32位,我把当中的register都
: 改成了Exx,(不知这样是否正确)
: 其它的都没问题,唯有这一条
: move edx, offset PostMessage
: 提示的错误是:operand size conflict
: 如果改回:
: mov dx, offset PostMessage
: 则提示有两个以上同样的错误。
: 不知何故




发信人: pdhomer (小东子), 信区: Programming

【 在 suxm (笨笨) 的大作中提到: 】


我照着笨笨兄说的方法依葫芦画瓢,参照了帮助文件,
好歹是编译通过了,可是一运行,就出现了致命的错误

程序被关闭。

我只是把传送地址的那一段代码去掉

Vxd中的那一段Simulate_push 去掉
该成
_Shell_PostMessage  ,postMsgHwnd,WM_COMMAND,PM_VXDPOST,10002

错误类型为致命错误04

请笨笨兄再帮一把





: 很高兴看到你关于VXD的思考。就这样一点一滴的思考最终会
: 导致质的飞跃。
: 我以前那个例子,只是最最最最简单的一个VXD与WINAPP16的
: 通信。什么安全性都没有考虑,如果你把那个例子编译之后运
: 运,能成功,则算你走运,不能成功,也很正常。
: 我先假设你运行成功了。现在回答你的问题,怎样把它改成
: WIN32APP能用的形式。(我在这里所说的WIN32APP都是指在
: WIN95下的WIN32APP)。
: VXD如果想给WIN32app进行PostMessage(),那就不用这样
: 麻烦,你的做法纯粹是画蛇添手。根本用不着把WINAPP的
: PostMessage()的地址传给VXD。只用一个服务就可以替代
: 那许多的东东,比如说那一大堆Simulate_Push,根本用不着了。
: 那个我们必须而且只须用到的服务就是_SHELL_PostMessage()。
: (你看,WIN95还是给我们带来了一些好处的) 。
: 好了,把一开始说的话接上。以前的例子不安全的原因如下:
: 还记得我在前面的一篇章中讲过System VM与V86 VM的概念吧。
: 所有的WINAPP都运行在System VM中,所有的DOSAPP都运行
: 在V86 VM中。现在这个概念就起作用了。
: 假设一下,如果当前的VM不是System VM,而是某个V86 VM。
: 那么你的VXD的PostMessage就会失败。
: 所以安全的法子是,Call_Priority_VM_Event(),然后再PostMessage() 。
: 至于细节嘛,你先自己钻研一下,待你有了一些新的实践之后
: 再作探讨吧。




发信人: suxm (笨笨), 信区: Programming

别生搬硬套,得理解了再试。
试试下面的代码:

#define WM_USER_POSTVXD         10001   //自己定义一下啦

VOID _cdecl PostMessageHandler(DWORD dwPostMessageReturnCode,PVOID refdata)
{
        if(!dwPostMessageReturnCode)
                dprintf("Faint..,error\r\n");   //如果没有发送成功,就骂一句
}

.....
_Shell_PostMessage(PostMsghWnd,WM_USER_POSTVXD,0,hVM,PostMessageHandler,NULL);
.....           ~~~~~~~~~~~~                       ~~~~~~~~~~~~~~~~~~
                这是接收消息的hWnd                这个函数在上面

再有,希望你通过softice去调试,设置断点,然后仔细查看变量,很简单的。


【 在 pdhomer (小东子) 的大作中提到: 】
: 我照着笨笨兄说的方法依葫芦画瓢,参照了帮助文件,
: 好歹是编译通过了,可是一运行,就出现了致命的错误
: 程序被关闭。
: 我只是把传送地址的那一段代码去掉
: Vxd中的那一段Simulate_push 去掉
: 该成
: _Shell_PostMessage  ,postMsgHwnd,WM_COMMAND,PM_VXDPOST,10002
: 错误类型为致命错误04
: 请笨笨兄再帮一把




发信人: pdhomer (小东子), 信区: Programming

太感谢SUXM了,经过你这么一指点

我终于试出来了。确实理解不透,只是
生搬硬套,惭愧,还望笨笨兄以后多多指点


【 在 suxm (笨笨) 的大作中提到: 】
: 别生搬硬套,得理解了再试。
: 试试下面的代码:
: #define WM_USER_POSTVXD         10001   //自己定义一下啦
: VOID _cdecl PostMessageHandler(DWORD dwPostMessageReturnCode,PVOID refdata)
: {
:         if(!dwPostMessageReturnCode)
:                 dprintf("Faint..,error\r\n");   //如果没有发送成功,就骂一句
: }
: .....
: _Shell_PostMessage(PostMsghWnd,WM_USER_POSTVXD,0,hVM,PostMessageHandler,NULL);
: .....           ~~~~~~~~~~~~                       ~~~~~~~~~~~~~~~~~~
:                 这是接收消息的hWnd                这个函数在上面
: 再有,希望你通过softice去调试,设置断点,然后仔细查看变量,很简单的。




发信人: suxm (笨笨), 信区: Programming

爱拼就能赢啦。
再接再励吧。

【 在 pdhomer (小东子) 的大作中提到: 】
: 太感谢SUXM了,经过你这么一指点
: 我终于试出来了。确实理解不透,只是
: 生搬硬套,惭愧,还望笨笨兄以后多多指点




发信人: Dreammy (这个杀手不太冷), 信区: Programming

【 在 pdhomer (小东子) 的大作中提到: 】
: 我试了以下笨笨兄上次给的VXD的例程
: 想把它改到32位,我把当中的register都
: 改成了Exx,(不知这样是否正确)
: 其它的都没问题,唯有这一条
: move edx, offset PostMessage

     move edx , offset32 PostMessage

: 提示的错误是:operand size conflict
: 如果改回:
: mov dx, offset PostMessage
: 则提示有两个以上同样的错误。
: 不知何故





--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: hs5.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.239.237]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.519毫秒