写在前面
之前遇到32位程序调用64位DLL的问题,百度的结果是使用com组件完成进程间通信,真的是很不错的思路,可以完成多种混合编程。本文记录一下如何开发一个简单的COM组件。
创建工程
打开VS2019,新建项目,选择ATL项目,点击创建,然后选择ATL项目类型,可执行文件、动态链接库或者是服务,只是注册方式不一样。然后在解决方案资源管理器中,右键创建的项目->添加->新建项目,选择ATL->ATL简单对象,然后弹出属性页,填写短名称和ProgID,ProgID一般为组件类.短名称
,后面调用组件的时候要用到ProgID。填写这两项即可,别的不需要管,填写完毕点击完成。
修改头文件
在末尾的public里面声明你的函数。
Test.h
public:
// STDMETHODIMP这个宏是必要的
STDMETHODIMP Number(int __num1, int __num2, int* __result);
}
修改cpp
写你的函数内容。
Test.cpp
#include "pch.h"
#include "Test.h"
// STDMETHODIMP这个宏是必要的
STDMETHODIMP CTest::Number(int __num1, int __num2, int* __result){
*__result = add(__num1,__num2);
return S_OK;
}
修改IDL
创建项目后源文件里有一个xxx.ldl,这里是COM组件的入口,需要在此处写另一种函数声明。
interface ITest : IDispatch
{
[id(1)] HRESULT Number([in] int __num1, [in] int __num2, [out, retval] int* __result);
};
注册COM
三处修改完毕后就可以生成了,生成时会自动注册。注意注册COM组件需要管理员权限。 或者使用命令行:
# 注册
xxx.exe /regserver
# 卸载
xxx.exe /unregserver
vbs调用
set com = CreateObject("ATLService.Test")
dim num
num = com.CpicCaptcha(1,2)
msgbox num
写在后面
本文并没有写到64位调32位DLL的部分,此部分思路是,在ATL项目中调用32位DLL,并写成接口(Release时需选择x86),64位进程直接模型vbs调用COM组件接口即可。