| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 656 人关注过本帖
标题:请问VFP可以订阅windows的事件消息吗?
只看楼主 加入收藏
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
结帖率:0
收藏
已结贴  问题点数:20 回复次数:14 
请问VFP可以订阅windows的事件消息吗?
EVT_HANDLE EvtSubscribe(
  [in] EVT_HANDLE             Session,
  [in] HANDLE                 SignalEvent,
  [in] LPCWSTR                ChannelPath,
  [in] LPCWSTR                Query,
  [in] EVT_HANDLE             Bookmark,
  [in] PVOID                  Context,
  [in] EVT_SUBSCRIBE_CALLBACK Callback,
  [in] DWORD                  Flags
);
VFP可以使用这个API订阅windows事件消息吗?总是失败,头大啊。
搜索更多相关主题的帖子: API 消息 windows VFP 事件 
2024-06-20 10:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:10 
请问Callback参数是怎么实现的?

2024-06-20 11:39
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
收藏
得分:0 
byte sCode[] = {
            0x8B, //MOV EDI,EDI //(主要起到内存对齐的作用,网上查的,不知是否有用,就保存了)
            0xFF,0x55,//PUSH EBP
            0x8B,0xEC,//MOV EBP,ESP
            0x53,//PUSH EBX
            0x51,//PUSH ECX
            0x52,//PUSH EDX
            0xFF,0x75,0x30,//PUSH DWORD PTR [EBP + 0x30]
            0xFF,0x75,0x2C,//PUSH DWORD PTR [EBP + 0x2C]
            0xFF,0x75,0x28,
            0xFF,0x75,0x24,
            0xFF,0x75,0x20,
            0xFF,0x75,0x2C,
            0xFF,0x75,0x28,
            0xFF,0x75,0x24,
            0xFF,0x75,0x20,
            0xFF,0x75,0x1C,
            0xFF,0x75,0x18,
            0xFF,0x75,0x14,
            0xFF,0x75,0x10,
            0xFF,0x75,0x0C,
            0xFF,0x75,0x08, //PUSH DWORD PTR [EBP + 0x08]
            0x68,0x00,0x00,0x00,0x00,//cmd_dz   PUSH vfpcmd
            0x68,0x00,0x00,0x00,0x00,//nums    PUSH nums //参数个数
            0x68,0x00,0x00,0x00,0x00,//vfp_dz  PUSH vfpcom句柄
            0xB8,0x00,0x00,0x00,0x00,//my_fun_dz mov eax my_vfp_func
            0xFF,0xD0, //call eax               
            0x5A, //POP EDX
            0x59, //POP ECX
            0x5B, //POP EBX   
            0x8B,0xE5,//MOV ESP, EBP
            0x5D,//POP EBP
            0xC3,//RET
            0x00,0x00            
    };
基础代码就是在原来行者的基础上做些修改,可以最多接受15个参数,在一般应用上面是没有问题的。
后来,我又单独直接在c++的环境里测试了这里的代码,也是有报错的情况,只是没有把程序卡坏,可以不断运行。
https://learn.,下来我再单独在独立的线程里再试一下,是不是需要独立的线程。
因为这个回调函数是会不断被调用的,某种程度上会阻塞当前线程的,如果在VFP的主线程中调用的话,也是自找麻烦了。麻烦版主帮看看。



[此贴子已经被作者于2024-6-20 12:37编辑过]

2024-06-20 12:33
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
收藏
得分:0 
测试结果还是成功调用了VFP的callback回调函数,传递参数和返回参数都是正确的,只是执行完后,Wevtapi.dll的后续处理会报错,引起程序崩溃。不得原因。
2024-06-20 12:42
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
收藏
得分:0 
回调函数的原理就是在 my_vfp_func函数中,根据nums的函数个数,取得相应的参数与vfpcmd拼装成“vfpcmd(参数1,参数2,参数3..)”,然后交vfpcomobj(就是_VFP)的docmd来执行。
这样就一劳永逸了,不需要每次都去写那段汇编代码了。
2024-06-20 12:50
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
收藏
得分:0 
还真是需要在独立的线程去运行。目前微软官方的c++代码在独立线程中没有问题了。下来再测一下VFP的在独立线程中的情况。
2024-06-20 15:02
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
收藏
得分:0 
VFP多线程也失败。不玩了。一天时间又花过去了。
2024-06-20 16:09
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
会用C++了,可以不用vfp来处理这些相对较为底层的事情,vfp坐享C++的结果好了。
2024-06-20 16:56
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

能成功一盘,不能持续。

[此贴子已经被作者于2024-6-20 19:00编辑过]

2024-06-20 18:56
金太狼
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2023-2-11
收藏
得分:0 
坚持学习,总是一件好事情,特别是AI出现后,更是方便学习了。原来有这个讲究,学习行者的代码还没有学透。
AI:
__cdecl调用约定

特点:该调用约定要求调用者负责清理栈上的参数。

应用情景:在__cdecl约定中,一般使用ret指令返回,因为调用者需要自行清理参数,所以被调用函数不需要调整ESP的值。

示例:如果函数原型是int __cdecl myFunction(int a, double b);,在汇编中返回时只需使用ret指令。

__stdcall调用约定

特点:该调用约定要求被调用函数负责清理栈上的参数。

应用情景:在这种情况下,通常使用retn指令并附带立即数来调整ESP的值,从而清除参数。

示例:对于函数void __stdcall myFunction(int a, int b, int c);,如果有三个参数每个参数4字节,则返回指令应为retn 0xC(12字节)。
2024-06-21 08:18
快速回复:请问VFP可以订阅windows的事件消息吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038648 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved