用MFC写的OCX,在HTML调用事件有响应,多线程中调用时网页上事件无响应 :用消息通知来更新可以

news2024/12/23 18:56:38

问题:连接成功后,点交易无事件。但每次点连接都有事件。直接点交易也有事件。好像跟延时有关系。

Sleep(10000)可以,跟延时没关系。
固定参数也无响应,跟参数没关系。
可能是多线程有关系。用消息通知来更新可以。
在这里插入图片描述

void Callback(int code, const char* info) {
	// 处理回调函数的逻辑
	// 这里可以添加具体的回调处理代码
	//do something	
	PrintLog("Callback code: %d, info: %s", code, info);
	// 将参数传递给消息处理函数
	::PostMessage((HWND)pWnd->GetHwnd(), WM_MY_CUSTOM_MESSAGE, static_cast<WPARAM>(code), reinterpret_cast<LPARAM>(info));
	//pWnd->OCX_Callback(code, ConvertUnicodeCharToBSTR(info));//回调html
	PrintLog("Callback OK");
}
HRESULT CMFCActiveXControlSmartPosCtrl::OCX_Purchase(long amount, BSTR orderNo) {
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	PrintLog("OCX_Purchase");
	// 将BSTR转换为char*
	_bstr_t bstr(orderNo);
	const char* orderNoStr = static_cast<const char*>(bstr);
	// 调用DLL接口
	Purchase(amount, orderNoStr, Callback);//回调
	PrintLog("OCX_Purchase OK");
	return S_OK;
}


LONG CMFCActiveXControlSmartPosCtrl::OCX_DisConnectDevice()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此处添加分派处理程序代码
	PrintLog("OCX_DisConnectDevice");
	return DisConnectDevice();
}


LONG CMFCActiveXControlSmartPosCtrl::OCX_ListDevice(BSTR deviceNameList, VARIANT & deviceNameLen)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// 将BSTR转换为char*
	_bstr_t bstr(deviceNameList);
	char* deviceNameListStr = static_cast<char*>(bstr);


	// 调用DLL接口
	ListDevice(deviceNameListStr, &deviceNameLen.intVal);
	PrintLog("OCX_ListDevice OK");
	return 0;
}


HRESULT CMFCActiveXControlSmartPosCtrl::OCX_ConnectDevice(BSTR deviceName)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	PrintLog("OCX_ConnectDevice");

	// 将BSTR转换为char*
	_bstr_t bstr(deviceName);
	char* deviceNameStr = static_cast<char*>(bstr);
	// 调用DLL接口
	ConnectDevice(deviceNameStr, Callback);
	PrintLog("OCX_ConnectDevice OK");
	return S_OK;
}
// 定义处理消息的函数
LRESULT CMFCActiveXControlSmartPosCtrl::OnMyCustomMessage(WPARAM wParam, LPARAM lParam)
{
	//CString result = _T("Hello! OCX OK");
	//pWnd->OCX_Callback(1, result.AllocSysString());//回调html

	int code = static_cast<int>(wParam);
	const char* info = reinterpret_cast<const char*>(lParam);
	// 在这里使用 code 和 info 进行处理
	pWnd->OCX_Callback(code, ConvertUnicodeCharToBSTR(info));//回调html
	PrintLog("OnMyCustomMessage OK");
	return 0;
}

https://blog.csdn.net/GUMU12345/article/details/120009551 这里也没说太清楚。

MFC消息示例

	#define VER_SET_FOCUS WM_USER + 100
 
	
	
	ON_MESSAGE(VER_SET_FOCUS, &CWriteSnDlg::OnSetFocus)
	
	
 
	protected:
	afx_msg LRESULT OnSetFocus(WPARAM wParam, LPARAM lParam);
	
	
	afx_msg LRESULT CCVersionCompareOnlyDlg::OnSetFocus(WPARAM wParam, LPARAM lParam)
	{
		thisDlg->GetDlgItem(IDC_EDIT_BTMAC)->SetFocus();
		return 0;
	}
 
 
	SendMessage(VER_SET_FOCUS);

示例

在MFC(Microsoft Foundation Class)应用程序中,你可以使用PostMessageSendMessage函数来向窗口发送消息。以下是带参数的PostMessageSendMessage的示例:

示例1:使用 PostMessage 发送自定义消息

// 假设你有一个自定义的消息ID
#define WM_CUSTOM_MESSAGE (WM_USER + 1)

// 在你的窗口类中添加一个处理消息的函数
BEGIN_MESSAGE_MAP(CYourWndClass, CWnd)
    // 其他消息处理函数
    ON_MESSAGE(WM_CUSTOM_MESSAGE, OnCustomMessage)
END_MESSAGE_MAP()

// 定义处理消息的函数
LRESULT CYourWndClass::OnCustomMessage(WPARAM wParam, LPARAM lParam)
{
    // 在这里处理收到的消息,wParam和lParam可以包含参数
    int nParam1 = static_cast<int>(wParam);
    CString strParam2 = reinterpret_cast<LPCTSTR>(lParam);

    // 进行处理
    // ...

    return 0;
}

// 使用 PostMessage 发送消息
int nParam1 = 42;
CString strParam2 = _T("Hello, MFC!");

// 将参数传递给消息处理函数
::PostMessage(m_hWnd, WM_CUSTOM_MESSAGE, static_cast<WPARAM>(nParam1), reinterpret_cast<LPARAM>((LPCTSTR)strParam2));

示例2:使用 SendMessage 发送自定义消息

// 使用相同的自定义消息ID和消息处理函数定义如上

// 使用 SendMessage 发送消息
int nParam1 = 42;
CString strParam2 = _T("Hello, MFC!");

// 将参数传递给消息处理函数
LRESULT result = ::SendMessage(m_hWnd, WM_CUSTOM_MESSAGE, static_cast<WPARAM>(nParam1), reinterpret_cast<LPARAM>((LPCTSTR)strParam2));

// 等待消息处理函数返回,result 中包含返回值

上述示例演示了如何在MFC应用程序中使用PostMessageSendMessage向窗口发送自定义消息,并如何通过参数传递数据到消息处理函数中。你可以根据需要修改消息ID和参数类型来满足你的具体要求。记住,在使用SendMessage时,如果消息处理函数没有立即返回,它将会阻塞当前线程,而PostMessage则是异步的。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git创建仓库并建立远程连接

创建仓库 以gitee为例 首先需要创建一个项目在gitee 中 创建仓库之后 建立连接 git init 初始化项目 git add . // 将所有文件存储到暂存区 git commit -m 自己定义的名字 // 本地提交更新 git remote add origin 远程仓库地址 // 之后就将本地和远程仓库建立连…

JavaScript 基础第三天笔记

JavaScript 基础第三天笔记 if 多分支语句和 switch的区别&#xff1a; 共同点 都能实现多分支选择&#xff0c; 多选1大部分情况下可以互换 区别&#xff1a; switch…case语句通常处理case为比较确定值的情况&#xff0c;而if…else…语句更加灵活&#xff0c;通常用于范围…

无线通信——Mesh的最后一公里问题

其实“最后一公里”问题直到现在也是在探究的话题。首先解释一下什么是“最后一公里”&#xff1a;我们下班了&#xff0c;假如公司有专车把我们送到了地铁站。这非常的方便&#xff01;从地铁站坐上回家方向的地铁。也是很省事儿&#xff01;虽然中途在地铁需要换站&#xff0…

亚信科技AntDB数据库 高并发、低延迟、无死锁,深入了解AntDB-M元数据锁的实现

AntDB-M在架构上分为两层&#xff0c;服务层和存储引擎层。元数据的并发管理集中在服务层&#xff0c;数据的存储访问在存储引擎层。为了保证DDL操作与DML操作之间的一致性&#xff0c;引入了元数据锁&#xff08;MDL&#xff09;。 AntDB-M提供了丰富的元数据锁功能&#xff0…

华为鸿蒙4,3,2禁用Google谷歌服务框架,使用最新谷歌Google play服务

华为鸿蒙4,鸿蒙3,鸿蒙2有一些应用或者游戏尤其是游戏需要最新版的谷歌play服务支持才可以使用。但是华为的鸿蒙系统解决完”设备未经 play 保护机制认证”之后,最稳定的谷歌play服务是20这个版本&#xff0c;一旦升级到最新的Google谷歌play服务&#xff0c;目前是最新版本23这…

LabVIEW应用开发——VI模块化

我们在写C语言的时候&#xff0c;一些模块化的功能或者多次调用的功能&#xff0c;我们一般会用一个函数封装起来&#xff0c;方便使用并且让代码看起来更加的简洁。这种函数一般都会包含这几个概念&#xff0c;输入参数、输出参数和返回值。而LabVIEW的VI就可以当作是一个函数…

led台灯哪个牌子最好?2022最新的台灯牌子排名

想要选好护眼台灯首先我们要知道什么是护眼台灯&#xff0c;大的方向来看&#xff0c;护眼台灯就是可以保护视力的台灯&#xff0c;深入些讲就是具备让灯发出接近自然光特性的光线&#xff0c;同时光线不会伤害人眼而出现造成眼部不适甚至是视力降低的照明设备。 从细节上看就…

EasyX趣味化编程note2,绘制基本图形

创意化编程&#xff0c;让编程更有趣 今天介绍的仍为比较简单的效果&#xff0c;由浅入深来进行学习 介绍每个函数都会附上代码和运行结果&#xff0c;感兴趣的大家可以复制粘贴运行一下看看效果&#xff0c;也可以自己进行改动&#xff0c;非常好玩且加深印象。 上节课的知识…

wsl2 更新报错问题解决记录

1、问题 win10 中安装的 wsl2&#xff0c;启动 docker desktop 时提示 wsl2 有问题&#xff1a; 于是点击推荐的地址连接到微软&#xff0c;下载 wsl2 的更新文件。之后运行&#xff0c;又报错&#xff1a; 更新被卡住。 2、解决方法 WinR 输入 cmd 打开命令行窗口&#x…

基于Vue+ELement搭建动态树与数据表格实现分页模糊查询

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

self-XSS漏洞SRC挖掘

本文由掌控安全学院 - 一朵花花酱 投稿 Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语言吸…

MySQL数据库基本操作--DDL

文章目录 1. DDL2. 对数据库的常用操作3. 对表结构的常用操作数据类型数值类型字符串类型日期类型 基本操作修改表结构格式 1. DDL DDL(Data Definition Language)&#xff0c;数据定义语言&#xff0c;该语言部分包括以下内容&#xff1a; 对数据库的常用操作对表结构的常用…

我与南非的三次邂逅

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 特别感谢 / 南非旅游局、日光派对 本期节目中&#xff0c;我们邀请了一位特别的嘉宾索导&#xff0c;她将带领我们走进南非&…

ide unknown command (empty parse result): / 问题及解决方案

vs studio端口冲突了 在属性 web 修改端口号就能解决 搞定

18661 2020 金属卤化物灯 钪钠系列 性能要求 学习记录

声明 本文是学习GB-T 18661-2020 金属卤化物灯 钪钠系列 性能要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了钪钠系列金属卤化物灯的分类与命名、主要尺寸、基本参数、技术要求、试验方法、检 验规则、标志、包装、运输和…

CSS详细基础(六)边框样式

本期是CSS基础的最后一篇~ 目录 一.border属性 二.边框属性复合写法 三.CSS修改表格标签 四.内边距属性 五.外边距属性 六.其他杂例 1.盒子元素水平居中 2.清除网页内外元素边距 3.外边距的合并与塌陷 4.padding不会撑大盒子的情况 七.综合案例——新浪导航栏仿真 …

微信小程序写一个将图片对象转成base64字符串的函数

这个我只能比较遗憾的说 小程序中大部分操作文件的API都是异步的 所以这个函数 我们还是要异步返回 其实大家肯定也都喜欢同步的 imageToBase64(image) {return new Promise((resolve, reject) > {const filePath image.path;// 获取图片文件大小wx.getFileInfo({filePath…

马尔萨斯《人口原理》读后

200 多年前的书&#xff0c;很多人都说旧的东西过时了&#xff0c;但我觉得它只是被修正了&#xff0c;内核并不过时。毕竟&#xff0c;静态存量分析这本身就不符合现实&#xff0c;用现在的话说&#xff0c;建模就错了&#xff0c;但马尔萨斯的理论核心并不仅仅是一个模型&…

IO流 之 缓冲流(字节缓冲流和字符缓冲流)

缓冲流对原始流进行了包装&#xff0c;以提高原始流读写数据的性能。 字节缓冲流&#xff08;BufferedInputStream和BufferedOutputStream&#xff09; 字节缓冲流在内存中提供了一个默认为8kb的区域&#xff0c;用于缓冲&#xff0c;当流开始时&#xff0c;先读取一个8kb的内…

【Orange Pi】Orange Pi5 Plus 安装记录

官网&#xff1a;Orange Pi - Orangepi 主控芯片&#xff1a;Rockchip RK3588(8nm LP制程&#xff09;NPU&#xff1a;内嵌的 NPU 支持INT4/INT8/INT16/FP16混合运算&#xff0c;算力高达 6Top支持的操作系统&#xff1a; Orangepi OS&#xff08;Droid&#xff09;Orangepi O…