OCX 添加方法和事件 HTML调用ocx函数及回调 ocx又调用dll VS2017
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分配一个BSTRBSTR 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() {//测试ocxvar ocx = document.getElementById("myOCX");try {var result = ocx.CommPosProcess("123");document.getElementById("S1").value = result;} catch (error) {document.getElementById("S1").value = error;}//测试ocx调用dlltry {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 中的等效类型:
-
int
/long
: 在 COM 中,等效的类型是long
. -
float
: 在 COM 中,等效的类型是float
. -
double
: 在 COM 中,等效的类型是double
. -
char
/unsigned char
: 在 COM 中,等效的类型是BSTR
(宽字符字符串)。 -
const char*
/char*
: 在 COM 中,等效的类型是BSTR
(宽字符字符串),或者可以使用VARIANT
结构的VT_BSTR
类型。 -
bool
: 在 COM 中,等效的类型是VARIANT_BOOL
,其中VARIANT_TRUE
表示true
,VARIANT_FALSE
表示false
。 -
wchar_t
/LPCWSTR
: 在 COM 中,等效的类型是BSTR
(宽字符字符串)。 -
const wchar_t* / wchar_t*
: 在 COM 中,等效的类型是BSTR
(宽字符字符串)。 -
char[]
: 在 COM 中,等效的类型是BSTR
(宽字符字符串)。 -
std::string
: 在 COM 中,等效的类型是BSTR
(宽字符字符串),或者可以使用VARIANT
结构的VT_BSTR
类型。 -
std::wstring
: 在 COM 中,等效的类型是BSTR
(宽字符字符串)。 -
指针类型: 指针类型在 COM 中可能对应到
IDispatch*
(用于接口)、IUnknown*
(用于接口)等接口指针。 -
自定义结构体和类: 在 COM 中,通常需要为自定义数据结构创建 COM 接口,并使用接口中的属性和方法来传递数据。
需要注意的是,COM 是一种基于二进制标准的技术,因此涉及数据类型的互操作性时,数据通常需要进行序列化和反序列化。上述类型的映射通常是针对参数传递和交互的一般规则,具体规则可能因 COM 接口定义和编程语言而异。
相关文章:

OCX 添加方法和事件 HTML调用ocx函数及回调 ocx又调用dll VS2017
ocx添加方法 类视图 最后面的XXXXXlib 右键 添加 添加方法。 其它默认 添加事件 类视图 最后面的XXXXX 右键 添加 添加事件。 这样编译就ocx可以了。 #include <iostream> #include <string> #include <comutil.h>CMFCActiveXControlSmartPosCtrl* …...

苹果iPhone手机使用草柴返利APP查询领取淘宝天猫京东优惠券如何取消关闭粘贴商品链接时的弹窗提示?
使用苹果手机在淘宝或京东复制商品链接,到草柴APP粘贴时总是弹窗提示,如何关闭苹果手机粘贴弹窗的提示? 苹果手机如何关闭粘贴弹窗提示? 1、在草柴APP内,点击底部「我的」接着点击「系统设置」进入; 2、进…...

主机安装elasticsearch后无法登陆
问题描述 2023年7月31日11点02分,主机安装elasticsearch后无法登陆,通过后台查看主机宕机状态,CPU达到100%,按业务侧要求执行重启操作后发现主机黑屏无法正常进入系统,系统卡死。 2.原因分析 2.1通过故障…...
【面试题精讲】JavaSe和JavaEE的区别
“ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 文章更新计划[2] 系列文章地址[3] 1. 什么是 JavaSE 和 JavaEE? JavaSE(Java Platform, Standard Edition&#…...

React 全栈体系(十五)
第八章 React 扩展 一、setState 1. 代码 /* index.jsx */ import React, { Component } from reactexport default class Demo extends Component {state {count:0}add ()>{//对象式的setState/* //1.获取原来的count值const {count} this.state//2.更新状态this.set…...
【逆向】(c++)分析pe结构,拉伸pe结构,缩小pe结构
建议大家认认真真写一遍,收获蛮大的,是可以加深对pe结构的理解,尤其是对指针的使用,和对win32的一些宏的定义的理解和使用。 #include <windows.h> #include <iostream> #include <string>using namespace std…...

PyTorch实战:常用卷积神经网络搭建结构速览
目录 前言 常用卷积神经网络 1.AlexNet 2.VGGNet 3.GoogLeNet 4.ResNet 总览 前言 PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架…...

排序算法之【快速排序】
📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 👍…...
声明式调用 —— SpringCloud OpenFeign
Feign 简介 Spring Cloud Feign 是一个 HTTP 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 HTTP 请求,而不用通过封装 HTTP 请求报文的方式直接调用 Feign 通过处理注解,将请求模板化,当实际调用的时候传入参数&#x…...
LuatOS-SOC接口文档(air780E)-- fota - 底层固件升级
fota.init(storge_location, len, param1)# 初始化fota流程 参数 传入值类型 解释 int/string fota数据存储的起始位置 如果是int,则是由芯片平台具体判断 如果是string,则存储在文件系统中 如果为nil,则由底层决定存储位置 int 数据存…...
第二章 Introduction
Armv8.4 架构引入了在安全状态下的虚拟化扩展。Arm SMMU v3.2 架构 [1] 增加了对安全流的第二阶段翻译的支持,以补充 Armv8.4 PE 中的安全 EL2 翻译体制。这些架构特性使得可以在安全状态下将彼此不信任的软件组件隔离开来。隔离是实现最小权限原则的机制࿱…...

WebGL 渲染三维图形作为纹理贴到另一个三维物体表面
目录 渲染到纹理 帧缓冲区对象和渲染缓冲区对象 帧缓冲区对象 帧缓冲区对象的结构 如何实现渲染到纹理 示例程序(FramebufferObject.js) 创建帧缓冲区对象(gl.createFramebuffer()) gl.createFra…...

国庆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书行将售罄
国庆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书行将售罄 国庆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书行将售罄...

Source Insight 工具栏图标功能介绍
这篇文章并不介绍 Source Insight 的具体使用方法,这类教程网上有很多,这里只分析 Souce Insight 工具栏图标的功能。 文章目录 Source Insight 简介Souce Insight 工具栏文件操作新建(CtrlN)打开(CtrlO)保…...
模板与泛型编程-函数模板
本专栏由于缺少函数模板专题,我本以为这个不用讲解,但由于某些同学基础比较薄弱,特地在此补充一下。 函数模板的定义一般都在头文件中。 一、如何定义一个模板函数 下面是一个求和函数 template<typename T,typename U> auto Add(T a, U b) {return a + b; }int...
了解ActiveMQ、RabbitMQ、RocketMQ和Kafka的特点
ActiveMQ ActiveMQ是一种基于JMS(Java消息服务)规范的消息中间件,由Apache基金会开发和维护 核心组件和特点: Broker(代理):ActiveMQ的核心组件是Broker,它负责接收、存储和路由消息…...

第七章 用户和组管理
7.1 Linux中的用户和组的分类 用户类别 超级用户(0) root 系统用户(1-999) 一般用户(1000-60000) 组类别 管理组 root 基本组(默认组/主组) 附加组(额外组) 7.2 用户管理 7.2.1 添加新用户 语法 useradd 【…...

给奶牛做直播之三
一、前言 上一篇给牛奶做直播之二 主要讲用RTMP搭建点播服务器,整了半天直播还没上场,今天不讲太多理论的玩意,奶牛今天放假了也不出场,就由本人亲自上场来个直播首秀,见下图,如果有兴趣的话࿰…...

【Java 进阶篇】MySQL 数据控制语言(DCL):管理用户权限
MySQL 是一个强大的关系型数据库管理系统,提供了丰富的功能和选项来管理数据库和用户。数据库管理员(DBA)通常使用数据控制语言(Data Control Language,简称 DCL)来管理用户的权限和访问。 本文将详细介绍…...

WPF 03
staticResource和dynamicResource的区别 首先看一个案例 MainWindow.xaml <Window x:Class"WpfDay03.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&quo…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...