WPF调用ActiveX控件开发、调试总结


导入导出模块是由C++开发的, 而当前的客户端用WPF开发的,需要将导入导出功能在WPF中实现一遍,可选的方案有两个:
一、重写导入导出功能
二、重用C++代码,封闭成ActiveX控件。
方案一技术上比较纯净,技术平台统一为C#后,对开发人员的要求也降低了,后期维护较便利;
方案二开发进度较快,而且相对要稳定些,主要是避免了业务的二次实现,本次采用方案二满足项目需求。
现将开发过程总结如下

封装

VS2010

步骤一 新建MFC ActiveX工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

步骤二 添加接口函数

在这里插入图片描述在这里插入图片描述

向导生成代码

1 idl

在这里插入图片描述

2 .h

在这里插入图片描述

3 .cpp

函数映射
在这里插入图片描述

步骤三 添加事件

未在2010中找到添加事件的向导,手动添加事件如下

idl

在这里插入图片描述

.h

在这里插入图片描述

.cpp

在这里插入图片描述在这里插入图片描述

步骤四 代码改造

这部分是和业务相关的, 这里描述下。主要是移除对协议模块、配置模块的依赖,主要是部署时涉及的内容较多。

接口代码编写

完成WPF接口调用向C++逻辑的转换,主要是步骤二中接口函数的实现,与业务独立

移除对既有库的依赖

配置从WPF配置文件读取,协议模块通过事件通知至WPF,由WFP完成HTTP通信,日志模块仍延用(主要原因是改起来涉及面较广)

既有代码改造

最大的改造是:原来的导入、导出是通过窗口事件实现异步的,这在测试过程中发现ActiveX窗口事件失效,修改为线程方式实现。

步骤五 错误处理

控件注册失败

如下,注册过程相当于执行过程,注册是需要所有依赖库存在的
在这里插入图片描述

处理方式

控件对外是通过接口、事件实现交互的,建议接口一次定义完成,并且在业务代码添加前完成控件注册,注册完成后,修改为不再注册,工程设置如下图。
主要是控件的注册是需要所有依赖库存在的,本次工程开发过程中因对依赖项不太清楚,导致缺少依赖库,一直注册不成功,耗费了我和何工不少时间。而且开发过程可以专注业务代码编写。当然知道了这个原因,修改为每次注册也是可以的(本次工程开发发现这个原因后,找到了所有依赖库,也是每次都注册)
在这里插入图片描述
在这里插入图片描述

步骤六 自测

自测采用TstCon.exe,如下工程设置,

1 工程设置

在这里插入图片描述

2 启动调试

在这里插入图片描述
在这里插入图片描述

3 加载控件

在这里插入图片描述

4 执行方法

在这里插入图片描述

5 断点触发-开始调试

在这里插入图片描述在这里插入图片描述

6 接口参数设置

对于有参接口,如下设置
在这里插入图片描述

7 控件加载失败

如下,对于自测操作需要所有依赖库就绪,自测就是把控件执行起来了,这种错误基本是缺少依赖的库
在这里插入图片描述

模块集成

导出dotNet识别的接口类

在这里插入图片描述
在这里插入图片描述

2019

只能导出类型库, 在wpf程序中调用会报
灾难性故障 (异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))
在这里插入图片描述

注册控件

在这里插入图片描述

WPF工程引用

添加对AxImportExportActiveXLib的引用,如下
在这里插入图片描述

WPF源码修改

xaml文件修改

在这里插入图片描述

定义变量

在这里插入图片描述

初始化

在这里插入图片描述

接口调用

在这里插入图片描述

事件响应

在这里插入图片描述

集成测试

集成测试偏向于开发环境自测,不再赘述

系统测试

系统测试偏向于生产/测试环境自测,重点描述
系统测试时,用到的技术是远程调试,目前无法同时调试控件代码和宿主代码,因此在调试时,需要分开调试,如下说明 。

安装远程调试工具

各个版本的vs均有对应的远程调试工具

vs2010

vs2017

vs2019

环境注册控件

启动远程调试工具(以vs2019为例)

在这里插入图片描述

本地vs设置

vs2019

控件调试

对控件代码进行调试,以控件为启动工程
在这里插入图片描述

输出参数

在这里插入图片描述

远程启动宿主

这种方式会在73上启动IPS3DShell、控件,应用场景不再赘述,通过本地代码进行调试
在这里插入图片描述

本地启动宿主

这种方式会在本地启动IPS3DShell、控件,应用场景不再赘述,通过本地代码进行调试
在这里插入图片描述

宿主调试

对宿主WPF进行调试,以WPF为启动工程
在这里插入图片描述

vs2010

调试参数

在这里插入图片描述

输出参数

在这里插入图片描述

WPF调用WinForm控件是通过将WinForm控件嵌入到WPF内容中实现的。首先,需要在WPF项目中引用`WindowsFormsIntegration`命名空间。 1. 创建WinForm控件:在WinForm项目中创建所需的WinForm控件,例如一个Windows.Forms.Button。 2. 在WPF中添加WindowsFormsHost控件:在WPF的XAML文件中,添加一个WindowsFormsHost控件。 ```xaml <Grid> <WindowsFormsHost Name="windowsFormsHost1" /> </Grid> ``` 3. 将WinForm控件添加到WindowsFormsHost控件中:在WPF的代码文件中,在相关的事件处理程序或页面加载完成等事件中,将WinForm控件添加到WindowsFormsHost控件中。 ```csharp private void Window_Loaded(object sender, RoutedEventArgs e) { System.Windows.Forms.Button winFormButton = new System.Windows.Forms.Button(); windowsFormsHost1.Child = winFormButton; } ``` 通过以上步骤,就可以将WinForm控件嵌入到WPF中了。需要注意的是,由于WPF和WinForm使用了不同的UI渲染技术,嵌入的WinForm控件的外观可能会与周围的WPF控件不完全一致,需要进行一些样式调整来保持一致性。 同时,还可以通过WPF的命令模型和事件模型与嵌入的WinForm控件进行交互。例如,可以通过WPF的命令绑定和事件处理程序来响应WinForm控件的点击事件,实现业务逻辑的处理。 总而言之,通过WindowsFormsHost控件可以在WPF中嵌入WinForm控件,并通过WPF的命令和事件模型来与其进行交互,提供更丰富的用户界面和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值