[英]How to forward-declare _com_ptr_t pointers?
我想创建一个用于包装Excel Automation的库,并仅公开其某些功能。 我正在使用#import机制与Excel的COM配合使用,所以现在我有了:
// EXCELAPP.H
#import "C:\\PathTo\\mso.dll" //...
#import "C:\\PathTo\\VBE6EXT.OLB" //...
#import "C:\\PathTo\\EXCEL.EXE" //...
class ExcelApp
{
public:
ExcelApp();
~ExcelApp();
void CloseExcel();
void ShowWindow();
void HideWindow();
// ...
private:
Excel::_ApplicationPtr m_app;
};
这是在静态库项目中,我在程序中使用它就很好。
问题是,我想对库用户“隐藏”它是如何实现的。 将来可能会更改实现。 另外,在.h文件中导入文件会将所有COM接口暴露给库的用户,我不希望它们(包括我的未来自我)滥用它。
所以我想做类似PImpl习惯用法的事情,但是我至少需要向前声明m_app,而且我不知道该怎么做。
因此,有什么方法可以像Excel :: _ ApplicationPtr一样转发声明_com_ptr_t指针? 还是有更好的方法来做我想做的事情?
如果您真的想那样做。 我将创建一个没有m_app指针的基类。 将所有功能虚拟化。 (是的,这基本上是在创建一个“接口”。(将其称为CExcelApp ...)
从第一课开始。 在其中添加m_app变量并覆盖所有虚拟函数。 您不会向用户公开此类。 (将其称为CExcelAppImp ...或其他名称)
在您的基类中,创建一个静态函数来实例化CExcelApp的实例,但是在实现中,它将实例化CExcelAppImp。
class CExcelApp
{
protected:
CExcelApp(); // make your constructors protected
public:
static CExcelApp* CreateInstance();
};
// in your implementation
CExcelApp CExcelApp::CreateInstance()
{
return new CExcelAppImp();
}
这只是一种方式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.