新手教程:COM/ATL 简单项目






4.60/5 (71投票s)
1999 年 12 月 2 日
6分钟阅读

592253

3294
本教程的目的是让您了解如何使用 ATL 创建 COM 服务器,然后能够从 Visual C++ 和 Visual Basic 程序中调用该服务器。
引言
本教程的目的是让您了解如何使用 ATL 创建 COM 服务器,然后能够从 Visual C++ 程序和 Visual Basic 程序中调用该服务器。我不会深入探讨 COM 的细节,也不会用 IDL 来让您感到负担,本教程旨在向新的 VC++ 程序员展示使用 ATL 创建“简单”COM 对象有多么容易,并激发他们学习更多知识的兴趣。
步骤 1:运行 ATL COM 向导
您需要做的第一件事是启动 Visual C++ 并创建一个新项目。选择“ATL COM AppWizard”。在项目名称中,将其命名为“Simple_ATL”。设置要保存此项目的路径,然后单击“确定”按钮。您将看到一个提供多种选择的屏幕。第一个选择是“服务器类型”。我们将构建一个服务器 DLL,因此请确保“服务器类型”设置为“动态链接库”。下面的其他三个复选框与我们当前的这个项目无关,因此可以忽略它们。单击“完成”按钮,让向导为您生成相应的文件。“新项目信息”窗口将出现,告诉您将创建哪些文件。单击“确定”按钮接受。
步骤 2:创建新的 ATL 对象
确保您可以在 VC++ IDE 中看到“工作区视图”。您可以通过单击“视图”菜单,然后选择“工作区”来执行此操作。将有三个选项卡,单击“类视图”选项卡。您应该看到“Simple_ATL Classes”。右键单击它,然后从弹出菜单中选择“新建 ATL 对象”。您将看到如下窗口:
默认选择(简单对象)正是我们想要的。单击“下一步”按钮,您将进入“ATL 对象向导属性”窗口。在“短名称”文本框中,输入“First_ATL”。注意向导如何自动为您填充其余的文本框。单击顶部的“属性”选项卡。在这里,您可以做出几个选择。对于第一个选择“线程模型”,我们将坚持使用默认的“单元模型”。对于“接口”,单击“双”。最后,由于我们不关心“聚合”,因此单击“否”单选按钮。我们无需担心底部的任何三个复选框。单击“确定”按钮,让向导创建我们的新的 ATL 简单对象。
步骤 3:添加一个方法
如果现在在工作区中单击“类视图”选项卡,您会注意到向导添加了很多内容。我们要做的第一件事是添加一个方法。我们可以通过右键单击“IFirst_ATL”并选择“添加方法”来轻松完成此操作。
单击“添加方法”后,您将看到“向接口添加方法”窗口。在“返回类型”下,您可以看到默认情况下该方法将返回“HRESULT”。在大多数情况下,您应将其保留。下一个文本框允许我们输入方法名称。让我们输入“AddNumbers”。最后一个文本框询问我们要使用的参数。由于我们要将两个数字相加并得到一个结果,因此我们将使用三个参数。最后一个参数将是一个指针。现在,不进行关于 IDL 的 300 页教程,我们需要在参数文本框中输入以下内容:
[in] long Num1, [in] long Num2, [out] long *ReturnVal
简而言之,我们将两个参数声明为 long 类型,值作为 [in] 输入,最后一个值作为 [out] 返回结果。(第一次看到时可能看起来有点奇怪,但一旦您阅读了几本关于 COM 的书,就会更明白了)单击“确定”按钮。单击“类视图”选项卡,并展开所有“+”符号,以便树完全打开以供查看。在顶级接口(“IFirst_ATL”)下,您将看到我们的“AddNumbers”方法以及我们赋予它的参数。双击它,它会将您带入代码。添加以下代码:
STDMETHODIMP CFirst_ATL::AddNumbers(long Num1, long Num2, long *ReturnVal) { // TODO: Add your implementation code here *ReturnVal = Num1 + Num2; return S_OK; }
步骤 4:编译 DLL
信不信由你,但您已经构建了一个可工作的、使用 ATL 构建的 COM 服务器!当然,我们需要编译它。为此,请按“F7”键,让 VC++ 完成其工作。编译器将花费几秒钟进行编译。编译器将您的新 DLL 注册到注册表中,以便其他程序可以使用它。让我们试试看。
步骤 5:使用 Visual Basic 测试 COM 服务器
首先,我们将使用 Visual Basic 来测试 COM 服务器。(如果您没有 VB 版本,可以跳到有关使用 VC++ 测试 COM 服务器的部分)启动 VB 并选择“标准 EXE”作为您的项目。在对话框上放置一个命令按钮。现在我们需要为 COM 服务器添加一个引用。单击“项目”菜单并选择“引用”。向下滚动,直到看到“Simple ATL 1.0 Type Library”并单击它。
单击“确定”按钮。现在,双击您之前放置的命令按钮,VB 会将您带到该命令按钮的代码窗口。添加以下代码:
Private Sub Command1_Click()
Dim objTestATL As SIMPLE_ATLLib.First_ATL
Set objTestATL = New First_ATL
Dim lngReturnValue As Long
objTestATL.AddNumbers 5, 7, lngReturnValue
MsgBox "The value of 5 + 7 is: " & lngReturnValue
Set objTestATL = Nothing
End Sub
如果您是 VB 程序员,这应该相当直接。我们声明一个对象,调用 COM 服务器的“AddNumbers”,然后显示结果。按“F5”键运行 VB 项目,单击命令按钮,您应该会看到预期的结果。
不算太难。让我们再试一次,但这次是用 VC++。
步骤 6:使用 Visual C++ 测试 COM 服务器
如果 Simple_ATL 项目仍打开,请保存并关闭它,然后创建一个新项目。选择“Win32 控制台应用程序”并将其命名为“Test_ATL”。单击“确定”按钮,然后在下一个窗口中接受默认值(空项目)。单击“完成”按钮,然后再次按“确定”按钮。您现在应该有一个空项目。按“Control”和“N”键将一个文件添加到此项目中。在窗口中,选择“C++ 源文件”并将其命名为“Test_ATL.cpp”。按“确定”按钮接受。您应该有一个空白文件打开。我们现在需要添加一些代码来测试 COM 服务器。开始将以下代码添加到新的 cpp 文件中:
// You need to point this header file to the directory // you placed the Simple_ATL project #include "..\Simple_ATL\Simple_ATL.h" #include <iostream.h> // Copy the following from the Simple_ATL_i.c file // from the Simple_ATL project directory // NOTE: You can actually skip copying these if you want // and just include the Simple_ATL_i.c file, I simply added // it for clarity to show where these const variables are // coming from and what they look like const IID IID_IFirst_ATL = {0xC8F6E230,0x2672,0x11D3, {0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}}; const CLSID CLSID_First_ATL = {0x970599E0,0x2673,0x11D3, {0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}}; void main(void) { // Declare and HRESULT and a pointer to // the Simple_ATL interface HRESULT hr; IFirst_ATL *IFirstATL = NULL; // Now we will intilize COM hr = CoInitialize(0); // Use the SUCCEEDED macro and see if // we can get a pointer // to the interface if(SUCCEEDED(hr)) { hr = CoCreateInstance( CLSID_First_ATL, NULL, CLSCTX_INPROC_SERVER, IID_IFirst_ATL, (void**) &IFirstATL); // If we succeeded then call the AddNumbers // method, if it failed // then display an appropriate message to the user. if(SUCCEEDED(hr)) { long ReturnValue; IFirstATL->AddNumbers(5, 7, &ReturnValue); cout << "The answer for 5 + 7 is: " << ReturnValue << endl; IFirstATL->Release(); } else { cout << "CoCreateInstance Failed." << endl; } } // Uninitialize COM CoUninitialize(); }
步骤 7:编译并运行程序
通过按“F5”键编译程序,然后按“Control”和“F5”键运行它。您应该会看到一个 DOS 窗口打开并显示预期的结果。