不同语言之间的调用 - ATL COM方式实现

本文介绍了如何利用ATL COM技术进行多语言间的调用,详细讲解了从创建ATL工程、添加类及接口,到实现方法和不同语言(C++、Delphi、VB6)的调用过程,提供了具体的代码示例。
摘要由CSDN通过智能技术生成
 

上一篇说道了使用DLL的方式实现混合使用,但是使用过程还有一些复杂,比如VB用使用字符串的一些操作就不得不使用了lstrlen这个API来完成.而且DLL的使用范围也不够广泛,而这次介绍如何使用COM方式进行多语言间调用,相对DLL方式这个容易使用.

按照惯例先使用C++的方式编写(我是使用VS2005)

先新建一个ATL工程,名字为ComCore点确定之后点完成,使用默认的工程配置.再添加一个类选择ATL Simple Object名字输入CComTest


 

点options,选上ConnectionPoints


点完成,就能看到向导生成的代码了.

切换到类视图(Class View) 之后选中IComTest右键,选择添加方法(Add Method).


输入函数名字参数类型点添加再点完成,只此已经成功添加一个方法

第二个方法添加如下,在选中参数类型的时候,将out选项选上.


第三个方法如下,除了将out选项选中,还将retval选项选中.


接下来在类视图里面选中_ICComTestEvents(在ComCoreLib中),右键选择添加方法,增加一个有两个参数的函数.


接下来选中CCComTest右键,添加->添加连接点(Add Connections Point)


将_ICComTestEvents这个增加到右边,如上图.点击完成

至此,我们已经将所需要的接口都添加上去.点编译即可.但我们只是提供了函数的接口,并没有实现,现在将实现添加上去.打开CComTest.cpp文件就会看到三个函数的空实现(我删掉了注释)

STDMETHODIMP CCComTest::OneFunction(VARIANT p_array )
{
   
return S_OK;
}

STDMETHODIMP CCComTest::Two(
VARIANT* p_var )
{
   
return S_OK;
}

STDMETHODIMP CCComTest::Three(
BSTR* p_ret )
{
   
return S_OK;
}

  我们添加合适的代码上去先到CComTest.h给CCComTest增加一个私有的成员变量long len;在构造函数中初始化为0

#include < atlsafe.h >
#include
< comutil.h >
#pragma comment(lib,"comsuppw.lib")
// CCComTest
STDMETHODIMP CCComTest::OneFunction(VARIANT p_array)
{
   
this -> Fire_EventOne( _bstr_t( " 回调的哦 " ) , p_array );//调用回调函数

   
if ( (VT_INT == p_array.vt) | (VT_I4 == p_array.vt) ) { //得到参数的内容,这里使用VARIANT ,当然也可以直接使用long类型来做参数
        len
= p_array.lVal;
       
return S_OK;
    }
else
       
return S_FALSE;
}

STDMETHODIMP CCComTest::Two(VARIANT
* p_var)
{
    SAFEARRAYBOUND bound[
1 ] = { len };//传递一个数组,这里使用了SafeArray
   
    CComSafeArray
< BYTE > x( bound );
   
for ( int i = 0 ;i < len;i ++ ){
        x[i]
= i;
    }
    p_var
-> vt = VT_ARRAY | VT_UI1;
    x.CopyTo(
& (p_var -> parray) );
   
return S_OK;
}

STDMETHODIMP CCComTest::Three(BSTR
* p_ret)
{
    _bstr_t bstr
= _bstr_t( _variant_t( len ) );//传递一个字符串类型
   
* p_ret = bstr.copy( true );
   
return S_OK;
}

这样整个测试的COM就算完成了,点编译即可编译出一个DLL,IDE会自动将这个DLL注册

 C++调用方法(for VC)

还是在刚才的工程里面,增加一个win32 的console工程,使用默认的工程选项.

在stdafx.h中添加如下代码

#import " ..ComCoreDebugComCore.dll " no_namespace // 这里的路径COM的dll的路径.

#include
< atlbase.h >
#include
<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值