65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (71投票s)

1999 年 12 月 2 日

6分钟阅读

viewsIcon

592253

downloadIcon

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 对象”。您将看到如下窗口:

The ATL Object Wizard

默认选择(简单对象)正是我们想要的。单击“下一步”按钮,您将进入“ATL 对象向导属性”窗口。在“短名称”文本框中,输入“First_ATL”。注意向导如何自动为您填充其余的文本框。单击顶部的“属性”选项卡。在这里,您可以做出几个选择。对于第一个选择“线程模型”,我们将坚持使用默认的“单元模型”。对于“接口”,单击“双”。最后,由于我们不关心“聚合”,因此单击“否”单选按钮。我们无需担心底部的任何三个复选框。单击“确定”按钮,让向导创建我们的新的 ATL 简单对象。

ATL Object Wizard Properties

步骤 3:添加一个方法

如果现在在工作区中单击“类视图”选项卡,您会注意到向导添加了很多内容。我们要做的第一件事是添加一个方法。我们可以通过右键单击“IFirst_ATL”并选择“添加方法”来轻松完成此操作。

Adding a method

单击“添加方法”后,您将看到“向接口添加方法”窗口。在“返回类型”下,您可以看到默认情况下该方法将返回“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”并单击它。

Adding VB Reference

单击“确定”按钮。现在,双击您之前放置的命令按钮,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 项目,单击命令按钮,您应该会看到预期的结果。

Testing it in 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 窗口打开并显示预期的结果。

© . All rights reserved.