埃尔法哥哥64位程序调用32位动态库其一COM组件创建
做过windows平台软件开发的的同学应该都知道 , 在64位程序中调用32位动态库是相当困难的 , 一种简单方式是将32位动态库包装成为32位可执行文件 , 然后通过64位程序启动32位可执行文件 , 在启动时传递参数进行通讯 , 但这种方式比较局限 , 只能单向传递数据 , 更加高级一点的用法是通过进程间通讯的方式 , 例如:消息队列 , 共享内存 , socket , 信号量等方式 。 但这些方式难免又要在两个程序上面做大量的二次开发 , 总觉得不是很理想的解决方式 , 因此 , 尝试性的研究了一下通过微软的COM组件创建外部可执行程序的方式来实现这一目标 , 发现这种方式更加简单高效 , 以下简单介绍一下具体的实验过程 。
首先需要了解一下COM组件:COM(组件对象模型)是开发软件组件的一种方法 , 由以Win32动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码所组成 。 可以动态的插入或卸出应用 , 并向外提供接口供程序调用的能力 , 由此 , 正文开始 , 创建一个简单的windows平台的COM组件
第一步使用VS2015(可以是任意版本 , 一下以VS2015为例)创建ATL工程

文章图片
ATL工程创建
ATL向导中选择可执行文件 。 也可以选择服务EXE(经本人测试 , 服务EXE在客户端调用后不能接收回调事件 , 可能是未选择连接点导致)

文章图片
ATL工程创建
创建工程完成后 , 给工程中添加一个ATL简单对象类 , 命名为TestClass

文章图片
简单对象创建
下一步至如下页面

文章图片
简单对象创建
线程模型默认选择单元 , 如果计划在COM组件回调函数到达时通知当前程序需要选择连接点 , 也可创建完类后再在文件中手动添加(COM里面的连接点就好像是C语言的回调函数 , 只不过它是基于面向对象实现的 。 连接点的作用也就是COM对象将一些事件通知给调用者)
完成后切换到类视图 , 右键ITestClass类添加方法 , 添加向外提供的接口名称及参数 , 其中[in]表示输入参数 , [out]表示输出参数 。 例如下面例子 , 创建了一个Init方法

文章图片
添加方法及定义参数
最后切换至工程目录 , 在Init方法下添加需要在COM中实现的功能 , 可以直接调用32为dll中的相关接口方法 。

文章图片
添加接口实现的功能
完成后选择x86平台进行编译 , 如果不出意外将在指定目录下生成ATLTest.exe文件 。
至此 , 一个简单的COM组件就编写完成了 。 接下来我们需要做的是将此COM组件注册进系统 , 并在64位的程序调用这个组件 , 以达到调用32位动态库的目的 。
注册COM组件需要管理员权限 , 以管理员权限打开命令行窗口 , 进入到ATLTest.exe文件所在目录下然后执行
ATLTest.exe/regserver
即可将COM组件注册进系统服务 , 此时此组件就可被其他程序检测并使用了 。 由于篇幅过长 , 本次就暂时介绍到这里 , 关于客户端程序对COM组件的调用将在下篇文章中继续介绍 , 由于本人也是探索性的学习 , 文章中难免会出现错误和不足的地方 , 有问题还请大家不吝指教 。
【埃尔法哥哥64位程序调用32位动态库其一COM组件创建】以上就是本人对Windows平台COM组件开发的一些实践 , 在学习过程中也看到部分同学认为COM组件太老旧 , 已经被淘汰 , 但就目前个人认识来看 , COM组件也是一种比较好的软件模块化的方式 , 并且COM组件都是按照COM规范实现 , 一次编译后生成二进制文件 , 在windows和linux下可直接使用 , 不需要重新编译 。 另外COM组件也支持远程和分布式调用 。 因此 , 暂时不会被淘汰 , 其中的相关技术知识点还是值得深入学习的 。
推荐阅读
- 大头哥哥说娱乐|一年不用还花呗的支付宝用户,如今怎么样了?,抽中“花花卡”
- 大头哥哥说娱乐|而自己却还不知道?教你几招快速分辨真假好友,微信已被好友删除
- 大头哥哥说娱乐|支出金额惊人,却被夸:是位圣人,马云的支付宝账单被曝光
- 埃尔法哥哥|尖端芯片开发商BrainChip已完成Akida仿神经系统芯片的制造
- 埃尔法哥哥|百度大脑AI技术成果白皮书
- 阿尔法公社|苹果用自研桌面电脑芯片实现软硬件生态大一统,抛弃Intel
- 创业靖哥哥|掌握这5个关键词就够了!,传统实体店想转型成功
- -悟空哥哥-|Neo3年中大促优惠力度空前,配置远超同价位机型,iQOO
- 大话百科天地|但它取胜的利器是模仿人类,“阿尔法狗”虽然在棋盘上战胜了人类
- -悟空哥哥-|小白智能摄像机A1小黄人联名款体验,功能丰富且颜值在线
