资源库-软件体系结构 实验一
第一步,我们先新建一个项目。

为了保证本资料的无脑性,故项目名称在此不作修改,后续有涉及再详细阐述。


我们可以通过图中所示的路径找到创建一个ATL简单对象:


为了保证本资料的无脑性,故在此ATL简单对象的名字不作修改,后续有涉及再详细阐述。

STDMETHODIMP AddNumber(long __num_1__, long __num_2__, long* __res__);
在ATLSimpleObject.h处加入我们的函数声明:STDMETHODIMP作为返回类型不可更改。AddNumber是函数名可以更改。__num_1__与__num_2__是两个形式参数。打这么多下划线是为了防止与某些库函数内的变量重名。__res__在实际运用中是存放结果变量的地址。
在ATLSimpleObject.cpp处加入我们的函数实现:

STDMETHODIMP CATLSimpleObject::AddNumber(long __num_1__, long __num_2__, long* __res__) {
*__res__ = __num_1__ + __num_2__;
return S_OK;
}
STDMETHODIMP是一个告知系统调用是否正常的变量,不可更改。此时AddNumber方法被作用域运算符::限定在CATLSimpleObject的范围内。我们可以发现这个类名实际上是字符’C’拼接我们的ATL简单对象的名字。
此处函数逻辑较为简单因此直接存放结果即可。
此时我们需要在ATLPorject1.idl中添加方法接口设置:

[id(1)] HRESULT AddNumber([in] long __num_1__, [in] long __num_2__, [out, retval] long* __res__);
[id(1)]是系统对这个方法进行标识的依据。出现两个同样的id会导致编译错误。
[out,retval]标记不算是一种重复。out关键字表示这个变量是一个输出参数。retval关键字表示这个变量是这个函数的返回值。一个函数只能有一个用retval关键字的参数,且其一定是一个out参数。
接下来我们生成一下这个组件。模式选择Release/x64


接下来我们注册这个COM组件:
有一个名为ATLProject1.dll的文件在我们的项目根目录\x64\Release下生成。
我们用管理员模式启动Powershell或者cmd:
在上述dll同级目录下输入:regsvr32.exe -i .\ATLProject1.dll。
意思是启动DLLRegisterServer,-i参数表示DLLInstall也会启动

regsvr32.exe -i .\ATLProject1.dll
注册完毕以后我们新建一个控制台窗口程序调用一下之前注册的库:
在这里我推荐采用绝对路径找到生成的”[ProjectName]_i.c”与”[ProjectName]_i.h”文件。
先初始化(CoInitialize),再创建对象的实例(CoCreateInstance)。
CoCreateInstance方法中的两个超级长的参数实际上是:CLSID_[AtlSimpleObjectName]与IID_I[AtlSimpleObjectName]

#include <iostream>
#include "D:\WorkPlaces\COMTest\ATLProject1\ATLProject1_i.c"
#include "D:\WorkPlaces\COMTest\ATLProject1\ATLProject1_i.h"
//#include "pch.h"
using namespace std;
int main() {
IATLSimpleObject* test;
if (CoInitialize(0) != S_OK) {
cout << "Failed\n";
}
HRESULT hResult = CoCreateInstance(CLSID_ATLSimpleObject, 0, CLSCTX_INPROC_SERVER, IID_IATLSimpleObject, (void**)&test);
if (hResult != S_OK) {
printf("instance failed");
return -2;
}
long result;
test->AddNumber(114514, 1919810, &result);
cout << result;
return 0;
}
可以看到result的结果是正确的。代表程序能够正常运行了。至于他为什么能正常运行?我哪知道(
本文介绍了如何在ATL项目中创建一个简单的COM对象,包括添加函数声明和实现、在IDL中设置接口、生成和注册组件,以及通过CoCreateInstance在控制台程序中调用该对象并验证功能。
1万+

被折叠的 条评论
为什么被折叠?



