使用VS2019创建ATL组件


写在前面

之前遇到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组件接口即可。