OCX 添加方法和事件 HTML调用ocx函数及回调 ocx又调用dll VS2017

news2024/11/28 4:37:53

ocx添加方法

类视图 最后面的XXXXXlib 右键 添加 添加方法。
在这里插入图片描述
其它默认
在这里插入图片描述

添加事件

类视图 最后面的XXXXX 右键 添加 添加事件。
在这里插入图片描述
在这里插入图片描述
这样编译就ocx可以了。
在这里插入图片描述

#include <iostream>
#include <string>
#include <comutil.h>

CMFCActiveXControlSmartPosCtrl* pWnd;



BSTR ConvertUnicodeCharToBSTR(const char* input) {
	// 计算字符串的长度(不包括终止空字符)
	int inputLength = strlen(input);

	// 计算需要的宽字符数目
	int wideCharCount = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);

	// 使用SysAllocStringLen分配一个BSTR
	BSTR bstr = SysAllocStringLen(NULL, wideCharCount);

	// 将char*的Unicode内容复制到BSTR中
	MultiByteToWideChar(CP_UTF8, 0, input, -1, bstr, wideCharCount);

	return bstr;
}
// CMFCActiveXControlSmartPosCtrl 消息处理程序

BSTR CMFCActiveXControlSmartPosCtrl::OCX_GetDllVersion()
{
	//AFX_MANAGE_STATE(AfxGetStaticModuleState());
	PrintLog("OCX_GetDllVersion");
	char version[10] = { 0 };
	GetDllVersion(version);
	PrintLog("GetDllVersion = %s", version);
	return ConvertUnicodeCharToBSTR(version);
}
BSTR CMFCActiveXControlSmartPosCtrl::CommPosProcess(BSTR b)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CString result = _T("Hello! OCX OK");
	return result.AllocSysString();
}
void Callback(int code, const char* info) {
	// 处理回调函数的逻辑
	// 这里可以添加具体的回调处理代码
	//do something	
	PrintLog("Callback code: %d, info: %s", code, info);
	pWnd->OCX_Callback(code, ConvertUnicodeCharToBSTR(info));//回调html
}
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());

	// TODO: 在此处添加分派处理程序代码
		// 将BSTR转换为char*
	_bstr_t bstr(deviceName);
	char* deviceNameStr = static_cast<char*>(bstr);
	// 调用DLL接口
	ConnectDevice(deviceNameStr, Callback);
	PrintLog("OCX_ConnectDevice OK");
	return S_OK;
}

HTML编写与调试

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!--  gb2312 -->
<title>Test</title>
<body>
<!--clsid : 如果控件成功注册到本机后,这个值在本机注册表中可以找到,js获取控件对象就是通过这个来找的。
<script type="text/javascript">
var _app = navigator.appName;
if (_app == 'Netscape') {
	document.write('<OBJECT name="ocxobject" ID="ocxobject" WIDTH="0" HEIGHT="0"',
			'TYPE="application/x-itst-activex"',
			'clsid="{D90F26D2-1FBC-4BC6-9722-393D338E6A68}"',
			'> </OBJECT>');
			
} else if (_app == 'Microsoft Internet Explorer') {
	document.write('<OBJECT name="ocxobject" ID="ocxobject" WIDTH="0" HEIGHT="0"',
					'CLASSID="CLSID:D90F26D2-1FBC-4BC6-9722-393D338E6A68"',
					'> </OBJECT>');
} else {
	document.write('<p>Sorry, unsupported browser.</p>');
} 
</script>-->  
		<p>
			<input type="button" value="清空" onclick="clearBtn()" /> 			
			<input type="button" value="BankTrans" onclick="BankTrans()" /> 
		</p>
		 <p><textarea id="S1"  rows="3"   cols="120"  ></textarea></p>
		 <p><textarea id="S2"  rows="3"   cols="120"  ></textarea></p>
		 <p><textarea id="S3"  rows="3"   cols="120"  ></textarea></p>
		 <object id="myOCX" classid="clsid:D90F26D2-1FBC-4BC6-9722-393D338E6A68"> </object>
<script LANGUAGE=javascript  FOR=myOCX EVENT=OCX_Callback(code,info)>
	//alert(code+info); //回调响应
	document.getElementById("S3").value="Code: " + code+" Info: " + info;
</script> 
<script type="text/javascript" language="javascript"> 	
	function BankTrans() {
		//测试ocx
		var ocx = document.getElementById("myOCX");
		try {
			var result = ocx.CommPosProcess("123");
			document.getElementById("S1").value = result;
		} catch (error) {
		   document.getElementById("S1").value = error;
		}
		//测试ocx调用dll
		try {
			var result = ocx.OCX_GetDllVersion();
			document.getElementById("S2").value = result;
		} catch (error) {
		   document.getElementById("S2").value = error;
		}
		//测试回调		
		try {
			var result = ocx.OCX_Purchase(1,"123456");
			//document.getElementById("S3").value = result;
		} catch (error) {
		   document.getElementById("S3").value = error;
		}		
	}
</script>
	
</body>  
</html>  

在这里插入图片描述
已经都成功了。方法(html调用ocx方法),事件(ocx触发回调html方法) 。
在这里插入图片描述

中间要注意的一些问题。

ocx只支持IE。windows11要edge要切换到ie模式。

如果dll找不到,调试的时候发现的,具体看ocx的日志,比如Loadlibrary时报126就是没找到dll,报193是dll是平台不一致 比如win32。win11 dll的路径最好写能绝对路径。

注册dll时就报缺少dll模块时:这可能是dll用lib加载的,不是动态Loadlibrary加载的。把相关的dll放在当前目录并复制到system32下。最好用个windows demo先试下,ok后再用ocx来调用。

报 Internet Explorer 已经为了帮助保护你的计算机而关闭此网页 也是没找到dll.

在这里插入图片描述

注册输出 选否。用手工注册即可。

在这里插入图片描述

::注册32位ocx 请用管理员运行
cd /d "%~dp0"


regsvr32 MFCActiveXControl1.ocx

::pause



::::注册64位ocx 请用管理员运行  注册一个 64 位的 OCX 文件(ActiveX 控件)需要使用 regsvr32 的 64 位版本 regsvr32.exe 来进行注册。
::cd C:\Windows\System32
::
::SET ocxPath=%~dp0MFCActiveXControl1.ocx
::regsvr32.exe /u %ocxPath%

所有与c++类型相对应的ocx类型

OCX(ActiveX 控件)通常在 Windows 平台上使用 COM(Component Object Model)来定义接口和类型。以下是一些常见的 C++ 类型与它们在 COM/OCX 中的等效类型:

  1. int / long: 在 COM 中,等效的类型是 long.

  2. float: 在 COM 中,等效的类型是 float.

  3. double: 在 COM 中,等效的类型是 double.

  4. char / unsigned char: 在 COM 中,等效的类型是 BSTR(宽字符字符串)。

  5. const char* / char*: 在 COM 中,等效的类型是 BSTR(宽字符字符串),或者可以使用 VARIANT 结构的 VT_BSTR 类型。

  6. bool: 在 COM 中,等效的类型是 VARIANT_BOOL,其中 VARIANT_TRUE 表示 trueVARIANT_FALSE 表示 false

  7. wchar_t / LPCWSTR: 在 COM 中,等效的类型是 BSTR(宽字符字符串)。

  8. const wchar_t* / wchar_t*: 在 COM 中,等效的类型是 BSTR(宽字符字符串)。

  9. char[]: 在 COM 中,等效的类型是 BSTR(宽字符字符串)。

  10. std::string: 在 COM 中,等效的类型是 BSTR(宽字符字符串),或者可以使用 VARIANT 结构的 VT_BSTR 类型。

  11. std::wstring: 在 COM 中,等效的类型是 BSTR(宽字符字符串)。

  12. 指针类型: 指针类型在 COM 中可能对应到 IDispatch*(用于接口)、IUnknown*(用于接口)等接口指针。

  13. 自定义结构体和类: 在 COM 中,通常需要为自定义数据结构创建 COM 接口,并使用接口中的属性和方法来传递数据。

需要注意的是,COM 是一种基于二进制标准的技术,因此涉及数据类型的互操作性时,数据通常需要进行序列化和反序列化。上述类型的映射通常是针对参数传递和交互的一般规则,具体规则可能因 COM 接口定义和编程语言而异。

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

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

相关文章

Linux内核启动流程-第二阶段rest_init函数

一. Linux内核启动 上一篇文章简单了解了 Linux内核启动第二阶段&#xff0c;涉及的 start_kernel函数。start_kernel 函数最后调用了 rest_init 函数&#xff0c;接下来简单看一下 rest_init 函数。 本文续上一篇文章的学习&#xff0c;地址如下&#xff1a; Linux内核启…

W5500+树莓派RP2040入门教程之MQTT篇(十二)

目录 1 前言 2 什么是MQTT协议&#xff1f; 2.1 特点 2.2 应用 2.3 身份 2.4 消息质量等级 2.5 遗嘱消息 3 硬件介绍 4 硬件接线 5 代码编写 6 移植说明 7 最终现象 8 总结 9 项目链接 1 前言 随着物联网技术的快速发展&#xff0c;MQTT&#xff08;Message Queuing Telemetry …

微分算子法求解常系数线性微分方程特解

1.微分算子法求解常系数线性微分方程特解 参考资料&#xff1a;全网讲解最清楚的微分算子法&#xff01; 1.1 微分算子法的思路 1.2 f ( x ) e α x f(x)e^{\alpha x} f(x)eαx 型 1.3 f ( x ) sin ⁡ β x f(x)\sin\beta x f(x)sinβx 或 f ( x ) cos ⁡ β x f(x)\co…

oracle VM virtualbox 自动挂载共享目录

目标&#xff1a; 1 安装增强插件 2 设置共享目录 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a3ef43aa3a934e4691bad53874f6b427.png 3 修改fstab sudo chmod 777 /etc/fstab vi /etc/fstab 增加一行&#xff1a; pc /mnt/pc vboxsf defaults 0 0 例子&#xff1a…

tensor维度变换

作用函数不变大小改变shapeview / reshape删减与增加维度squeeze / unsqueeze维度扩展expand / repeat矩阵转置&#xff0c;单次和多次交换操作t / transpose / permute 1、 view reshape view与reshape效果一致&#xff0c;且可以通用。直接以view为例&#xff1a; a torc…

CH08_搬迁特性

搬迁函数&#xff08;Move Function&#xff09; 曾用名&#xff1a;搬迁函数&#xff08;Move Method&#xff09; class Account{get overdraftCharge(){...}... }class AccountType{get overdraftCharge(){...}... }动机 模块化是优秀软件设计的核心所在&#xff0c;好的模…

C语言自定义类型讲解:结构体,枚举,联合(2)

&#x1f435;本篇文章将会对位段、枚举和联合的相关知识进行讲解 1. 位段&#x1f4da; 1.1 什么是位段 位段的声明和结构体类似&#xff0c;但是有两点不同&#xff1a; 1.位段的成员必须是int&#xff0c;unsigned int&#xff0c;signed int (C99之后也可以是其他成员&am…

Redis 线程模式

Redis 是单线程吗&#xff1f; Redis 单线程指的是 [接收客户端请求 -> 解析请求 -> 进行数据读写操作 -> 发送数据给客户端] 这个过程是由一个线程 (主线程) 来完成的&#xff0c;这也是常说的 Redis 是单线程的原因。 但是 &#xff0c;Redis 程序不是单线程的&am…

nginx 反向代理 负载均衡 动静分离

一样东西的诞生通常都是为了解决某些问题&#xff0c;对于 Nginx 而言&#xff0c;也是如此。 比如&#xff0c;你出于无聊写了一个小网站&#xff0c;部署到 tomcat 之后可以正常访问 但是后来&#xff0c;你的这个小网站因为内容很诱人逐步的火了&#xff0c;用户越来越多&a…

C#开发的OpenRA游戏之雷达地图

C#开发的OpenRA游戏之雷达地图 从前面的游戏里,就可以看到在上面按钮下面留有一个区域,这个区域的作用,就是用来显示一个雷达地图,如下图所示: 从雷达地图来看,可以清楚地看到全局的动态,自己的兵力分布,还有自己的建筑分布,矿产分布等等。 在这里就来对这个雷达地图…

Python编程:使用PIL进行JPEG图像压缩的简易教程

摘要: 本文介绍了如何使用Python编程语言和wxPython图形用户界面库进行JPEG图像的压缩。通过添加滑块控件&#xff0c;我们可以调整压缩质量&#xff0c;并将压缩后的照片另存为原来的名称加上后缀"压缩质量数字"的新文件。 C:\pythoncode\new\image2small.py 完整…

AI编程助手 Amazon CodeWhisperer 全面解析与实践

目录 引言Amazon CodeWhisperer简介智能编程助手智能代码建议代码自动补全 提升代码质量代码质量提升安全性检测 支持多平台多语言 用户体验和系统兼容性用户体验文档和学习资源个性化体验系统兼容性 功能全面性和代码质量功能全面性代码生成质量和代码安全性 CodeWhisperer的代…

程序启动-大数据平台搭建

1、启动zookeeper集群 /home/cluster/zookeeper.sh start /home/cluster/zookeeper.sh stop 2、启动hadoop和yarn集群 /home/cluster/hadoop-3.3.6/sbin/start-dfs.sh /home/cluster/hadoop-3.3.6/sbin/start-yarn.sh /home/cluster/hadoop-3.3.6/sbin/stop-dfs.sh /home/clust…

以太坊代币标准ERC20、ERC165、ERC721

两个概念 ERC(Ethereum Request for Comment) 以太坊意见征集稿EIP(Ethereum Improvement Proposals)以太坊改进提案 ERC和EIP用于使得以太坊更加完善&#xff1b;在ERC中提出了很多标准&#xff0c;用的最多的标准就是它的Token标准; 有哪些标准详细见https://eips.ethereum…

预制菜行业数据分析(京东数据挖掘)

最近一段时间&#xff0c;关于预制菜进校园事件的讨论热度高涨。而这两天&#xff0c;核酸大王“张核子”转行开预制菜公司卖方便米饭的消息又被传出&#xff0c;直接让预制菜市场饱受关注。 “预制菜是近两年的风口”&#xff0c;这个结论鲸参谋早在以往的内容中专门讨论过&a…

Java 18的未来:新特性和编程实践

文章目录 引言新特性预览1. 基于值的类的进一步改进2. 模式匹配的增强3. 新的垃圾回收器4. 扩展的模块系统5. 更强大的异步编程 编程实践示例1&#xff1a;基于值的类示例2&#xff1a;模式匹配的增强示例3&#xff1a;新的垃圾回收器 结论 &#x1f389;欢迎来到Java学习路线专…

python机器学习融合模型:Stacking与Blending(附代码)

1 堆叠法Stacking 一套弱系统能变成一个强系统吗&#xff1f; 当你处在一个复杂的分类问题面前时&#xff0c;金融市场通常会出现这种情况&#xff0c;在搜索解决方案时可能会出现不同的方法。 虽然这些方法可以估计分类&#xff0c;但有时候它们都不比其他分类好。在这种情况…

[WUSTCTF2020]颜值成绩查询 布尔注入二分法

这道题很简单 就是sql注入 我们来学习一下如何写盲注脚本 ?stunum1 ?stunum123 正确回显 100 错误 显示 not 。。。 这里很显然就是盲注了 我们来写个语句查询 if(ascii(substr(database(),1,1))>1,1,0)发现回显了 我们可以开始编写脚本跑了 import requests impor…

DeepMind 利用无监督学习开发 AlphaMissense,预测 7100 万种基因突变

类基因组共有 31.6 亿个碱基对&#xff0c;无时无刻不在经历复制、转录和翻译&#xff0c;也随时有着出错突变的风险。 错义突变是基因突变中的一种常见形式&#xff0c;然而人类目前只观察到了其中的一小部分&#xff0c;能够解读的更是只有 0.1%。 准确预测错义突变的作用&am…

Windows10/11显示文件扩展名 修改文件后缀名教程

前言 写这篇文章的原因是由于我分享的教程中的文件、安装包基本都是存在阿里云盘的&#xff0c;下载后需要改后缀名才能使用。 但是好多同学不会改。。 Windows 10 随便打开一个文件夹&#xff0c;在上方工具栏点击 “查看”点击 “查看” 后下方会显示更详细的工具栏然后点…