简介
几个星期以前,我拼命的寻找一个能够通过COM接口传递C++对象的例子,但是,没有找到.这就是我发表这篇文章的原因。
向ATL的DLL中传递一个C++对象参数并不是非常之难,但是,当然也会有点难度,也很有趣。
在开始一个工程以前,首先你得确信客户机和服务器组件都是适应C++的程序,其次,你必须知道怎样设置你的客户机和服务器。
接口的局限性
COM技术要求客户机和服务器高度的分离,这是通过接口实现的,但是问题出在:接口的方法中只提供了有限个参数数据类型,如果这个接口是基于IDispatch的,参数类型的可选范围就更加受到限制了,由于这些局限性,C++对象只有在满足以下条件时才能够传递:
客户机和服务器都是由VC++编写。
它们必须共享对象的定义(比如 头文件)。
传递应用程序设计的简单的对象。
你的应用程序可能需要运行在一个分布式环境下。你希望COM的远程活动,本地/远程活动是透明的,安全的。
我建议,在开始工作之前,先顺序的看一下各个标题,现在,我列出实例,并作以下事情:
创建一个ATL DLL服务器,
添加一个MFC类,从CObject类派生,
在类的头部使用 DECLARE_SERIAL 宏,
在类的中间使用 IMPLEMENT_SERI 宏,
覆盖Serialize() 方法,// 你的 CSimpleObj 类应该像这样:
class CSimpleObj : public CObject
{
DECLARE_SERIAL( CSimpleObj )
public:
// 构造函数和析构函数
CSimpleObj();
virtual ~CSimpleObj();
// 设置内部字符串数据
void SetString( CString csData );
// 用来向存档文件串行输入数据(序列化)
virtual void Serialize(CArchive& ar);
// 现实字符串数据
void Show();
private:
CString m_strData;// 内部字符串数据
};
// 把这个数据对象写入到文档中
void CSimpleObj::Serialize(CArchive& ar)
{
CObject::Serialize( ar );
if (ar.IsLoading())
{
// 从档案文件提取数据
ar >> m_strData;
}
else
{
// 把数据存入档案文件
ar << m_strData;
}
}
// 显示对象数据的方法
void CSimpleObj::Show()
{
AfxMessageBox(m_strData);
}
//把字符串数据保存到一个变量中
void CSimpleObj::SetString(CString csData)
{
m_strData = csData;
}