C++ VS 2008中ATL的创建,使用。并在C++项目以及C#项目中进行调用测试

图文并茂 简单 ATL COM开发

1.打开vs2010,新建ATL COM 项目,如下图1

2.勾选 【支持COM+ 1.0】和【支持部件注册器】用于C#

3 添加了一个com项目,在项目名称上点击右键,添加类,如下图

然后打开如下窗口,选择ATL简单对象即可。

然后是如下窗口,在简称一栏中输入类名称FirstClass,其他输入框会自动填写,然后点击完成即可。如果出现提示【是否覆盖现有文件】,点击【是】即可。

4.切换到类视图(视图->类视图),选中刚才添加的接口IFirstClass,如下,然后右键单击【添加】à添加方法。

打开了添加方法向导,如下,输入方法名【Add】,在下方增加参数。

先增加两个输入参数:勾选【in】,选择参数类型LONG,输入参数名para1,点击添加。同样操作增加参数para2.

然后增加一个返回参数:勾选【retval】,选择参数类型LONG*,输入参数名result,点击添加。

点击完成即可。如果点击下一步,打开如下窗口,如果不需要填写信息,点击完成即可。

5.切换到解决方案资源管理器,打开IDL定义文件FirstCom.idl,看到如下代码,就是定义的COM方法了。

interface IFirstClass : IDispatch{

         [id(1)] HRESULT Add([in] LONG para1, [in] LONG para2, [out,retval] LONG* result);

};

[

         uuid(77067637-4F17-4CBB-A12B-28979A8D21FB),

         version(1.0),

         custom(a817e7a1-43fa-11d0-9e44-00aa00b6770a,"{CB407CA1-C9ED-4A94-B505-91212F94FCED}")

]

6. 打开FirstClass.cpp 编辑方法逻辑如下:

// FirstClass

STDMETHODIMP  CFirstClass::Add(LONG para1, long para2, LONG* result)

{

         // TODO: 在此添加实现代码

         *result = para1 + para2;

         return S_OK;

}

7.至此,完成了COM编写,编译为dll,并自动注册到系统中。下面来调用一下刚才编写的COM,打开一个WPF项目,在项目文件上右击,选择【添加引用】,打开添加引用对话框,切换到COM选项卡,发现我们编写的COM已经在这里了,点击确定即可。

如果在COM选项卡里面没有看到,请使手工注册COM DLL,打开cmd,然后用Regsvr32注册。打开WPF项目的引用文件夹,如下,刚才添加的引用已经在这里了。

8. 使用WPF程序调试COM,编写代码如下:

public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            FirstComLib.FirstClassClass firstClass = new FirstComLib.FirstClassClass();

            int ret = firstClass.Add(1, 5);

        }

    }

测试发现,ret=6,调试成功~!

使用vs2010创建ATL项目可以自动完成复杂的com组建编写


用ATL生成com组件的步骤:
1,新建一个ATL项目,选择dll,其他默认参数即可
2,在类视图中,右击项目,添加一个类,在向导中填写类的名称,如,testClass。注意参考注意事项的第一条。此时看到多了一个ItestClass的条目。
3,右击ItestClass条目,添加一个方法,如add,设置参数,勾选in表示输入,勾选out和retval表示外界调用时返回的参数(ATL中的函数实际的返回值都是S_OK)
4,在解决方案资源管理器中,右击testClass.cpp,在其中补全add函数即可
参考链接:

注意事项:
一:在添加类的时候,有个ProgID,如图,这个属性实际上必填的,但是在vs2008之前这个值都是自动填上的,但是在vs2010里这个值需要手动添加,否则生成的dll文件,虽然可以在vs2010中开发的程序中调用,但是在其他程序中如PHP中则会出错(如:PHP的“unable to create object,无效语法”,或者无法注册控件等)。ProgID的值可以参考,vs2008之前的形式:projectname.classname的形式命名。


二:
实际上ProgID是其他语言指定这个类的唯一标识,所以必须指定,而且可以自由指定(详细的规则还不太了解),如在上图界面中指定ProgID为test1,则在php中要用 $com = new COM("test1")的形式引用

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值