基于COM组件实现C#调用C++类对象过程中的注意事项

一、基于COM的调用原理

调用原理:首先基于C++ ATL模板类,实现需求类(Class)的功能,并编译生成动态链接库(.dll)形式的COM组件;其次,基于C#以引用方式添加COM组件,实现调用C++编写的功能类。

总的来说,ATL 通过使用多重继承和模板技术来实现 COM 组件的开发,COM 是一种二进制接口标准,它提供了一种编程模型,使得不同的应用程序和组件之间可以相互协作。

二、注意事项

如何在C++ ATL中有效添加方法与属性

添加方式:
本人以VS2010为例,通过打开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);

猜你喜欢

转载自blog.csdn.net/HeyLoong/article/details/130395310
今日推荐