目录
- 一、基于COM的调用原理
- 二、注意事项
- 如何在C++ ATL中有效添加方法与属性
- 如何让C#调用C++中的属性(.idl中声明属性)
- 如何对变量类型进行转换
- C#如何获取C++类中的参数变量
一、基于COM的调用原理
调用原理:首先基于C++ ATL模板类,实现需求类(Class)的功能,并编译生成动态链接库(.dll)形式的COM组件;其次,基于C#以引用方式添加COM组件,实现调用C++编写的功能类。
总的来说,ATL 通过使用多重继承和模板技术来实现 COM 组件的开发,COM 是一种二进制接口标准,它提供了一种编程模型,使得不同的应用程序和组件之间可以相互协作。
二、注意事项
如何在C++ ATL中有效添加方法与属性
添加方式:
本人以VS20190为例,通过打开ATL工程文件中的类视图,选中所需添加方法或属性的类,右键添加即可。
如何让C#调用C++中的属性(.idl中声明属性)
需要注意的是,在 ATL 中,IDL(Interface Definition Language) 文件是用来定义 COM 接口的文件,使用 .idl 后缀名的 IDL 文件中可定义了 COM 接口的方法、属性和事件等信息。
因此,所添加的”属性“需要手动在".idl"文件中声明,从而暴露出接口实现外部调用。(ps:编译器会自动在.idl中对”方法“进行声明)
如何对变量类型进行转换
此外,由于ATL是服务于COM二进制文件的生成,其属性提供的”属性类型“与C++常用的变量类型有所区别。例如ATL的属性类型不支持string,为此我们需要利用”BSTR“类型进行代替。而BSTR 变量在内存中是以 Unicode 字符串的形式存储的,并且它会被 Visual Studio 的调试器显示成一个 16 进制数字,因此我们还需要进一步进行转换:
//举个例子
STDMETHODIMP CPerson::showName(BSTR Name)
{
// TODO: 在此添加实现代码
// Convert the BSTR to a C++ string
std::wstring wstr(Name);
std::string str(wstr.begin(), wstr.end());
cout<<" Name:"<<str;
return S_OK;
}
C#如何获取C++类中的参数变量
由于ATL模板的格式要求,函数返回类型为STDMETHODIMP ,不便于修改。因此,其需要利用函数的指针变量进行传递,传递方法如下所示:
//C++ ATL
STDMETHODIMP CPerson::get_cName(double* pVal)
{
// 将this->_dData转给*pVal
*pVal=this->_dData;
return S_OK;
}
//C# 获取Person类中的_dData值
Person _p=new Person();
string str = "TOM";
double dResult = 0;
_p.get_cName(ref dResult);
Console.WriteLine("Result:{0}", dResult);