当前位置: 首页 > news >正文

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 中的等效类型:

  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 接口定义和编程语言而异。

相关文章:

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

ocx添加方法 类视图 最后面的XXXXXlib 右键 添加 添加方法。 其它默认 添加事件 类视图 最后面的XXXXX 右键 添加 添加事件。 这样编译就ocx可以了。 #include <iostream> #include <string> #include <comutil.h>CMFCActiveXControlSmartPosCtrl* …...

苹果iPhone手机使用草柴返利APP查询领取淘宝天猫京东优惠券如何取消关闭粘贴商品链接时的弹窗提示?

使用苹果手机在淘宝或京东复制商品链接&#xff0c;到草柴APP粘贴时总是弹窗提示&#xff0c;如何关闭苹果手机粘贴弹窗的提示&#xff1f; 苹果手机如何关闭粘贴弹窗提示&#xff1f; 1、在草柴APP内&#xff0c;点击底部「我的」接着点击「系统设置」进入&#xff1b; 2、进…...

主机安装elasticsearch后无法登陆

问题描述 2023年7月31日11点02分&#xff0c;主机安装elasticsearch后无法登陆&#xff0c;通过后台查看主机宕机状态&#xff0c;CPU达到100%&#xff0c;按业务侧要求执行重启操作后发现主机黑屏无法正常进入系统&#xff0c;系统卡死。 2&#xff0e;原因分析 2.1通过故障…...

【面试题精讲】JavaSe和JavaEE的区别

“ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 文章更新计划[2] 系列文章地址[3] 1. 什么是 JavaSE 和 JavaEE? JavaSE&#xff08;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结构

建议大家认认真真写一遍&#xff0c;收获蛮大的&#xff0c;是可以加深对pe结构的理解&#xff0c;尤其是对指针的使用&#xff0c;和对win32的一些宏的定义的理解和使用。 #include <windows.h> #include <iostream> #include <string>using namespace std…...

PyTorch实战:常用卷积神经网络搭建结构速览

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

排序算法之【快速排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…...

声明式调用 —— SpringCloud OpenFeign

Feign 简介 Spring Cloud Feign 是一个 HTTP 请求调用的轻量级框架&#xff0c;可以以 Java 接口注解的方式调用 HTTP 请求&#xff0c;而不用通过封装 HTTP 请求报文的方式直接调用 Feign 通过处理注解&#xff0c;将请求模板化&#xff0c;当实际调用的时候传入参数&#x…...

LuatOS-SOC接口文档(air780E)-- fota - 底层固件升级

fota.init(storge_location, len, param1)# 初始化fota流程 参数 传入值类型 解释 int/string fota数据存储的起始位置 如果是int&#xff0c;则是由芯片平台具体判断 如果是string&#xff0c;则存储在文件系统中 如果为nil&#xff0c;则由底层决定存储位置 int 数据存…...

第二章 Introduction

Armv8.4 架构引入了在安全状态下的虚拟化扩展。Arm SMMU v3.2 架构 [1] 增加了对安全流的第二阶段翻译的支持&#xff0c;以补充 Armv8.4 PE 中的安全 EL2 翻译体制。这些架构特性使得可以在安全状态下将彼此不信任的软件组件隔离开来。隔离是实现最小权限原则的机制&#xff1…...

WebGL 渲染三维图形作为纹理贴到另一个三维物体表面

目录 渲染到纹理 帧缓冲区对象和渲染缓冲区对象 帧缓冲区对象 帧缓冲区对象的结构 如何实现渲染到纹理 示例程序&#xff08;FramebufferObject.js&#xff09; 创建帧缓冲区对象&#xff08;gl.createFramebuffer&#xff08;&#xff09;&#xff09; gl.createFra…...

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

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

Source Insight 工具栏图标功能介绍

这篇文章并不介绍 Source Insight 的具体使用方法&#xff0c;这类教程网上有很多&#xff0c;这里只分析 Souce Insight 工具栏图标的功能。 文章目录 Source Insight 简介Souce Insight 工具栏文件操作新建&#xff08;CtrlN&#xff09;打开&#xff08;CtrlO&#xff09;保…...

模板与泛型编程-函数模板

本专栏由于缺少函数模板专题,我本以为这个不用讲解,但由于某些同学基础比较薄弱,特地在此补充一下。 函数模板的定义一般都在头文件中。 一、如何定义一个模板函数 下面是一个求和函数 template<typename T,typename U> auto Add(T a, U b) {return a + b; }int...

了解ActiveMQ、RabbitMQ、RocketMQ和Kafka的特点

ActiveMQ ActiveMQ是一种基于JMS&#xff08;Java消息服务&#xff09;规范的消息中间件&#xff0c;由Apache基金会开发和维护 核心组件和特点&#xff1a; Broker&#xff08;代理&#xff09;&#xff1a;ActiveMQ的核心组件是Broker&#xff0c;它负责接收、存储和路由消息…...

第七章 用户和组管理

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

给奶牛做直播之三

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

【Java 进阶篇】MySQL 数据控制语言(DCL):管理用户权限

MySQL 是一个强大的关系型数据库管理系统&#xff0c;提供了丰富的功能和选项来管理数据库和用户。数据库管理员&#xff08;DBA&#xff09;通常使用数据控制语言&#xff08;Data Control Language&#xff0c;简称 DCL&#xff09;来管理用户的权限和访问。 本文将详细介绍…...

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…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...