上一篇说道了使用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文件就会看到三个函数的空实现(我删掉了注释)
{
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 < 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中添加如下代码
#include < atlbase.h >
#include <