如何前向声明_com_ptr_t指针?

时间:2016-09-21 16:28:09

标签: c++ com excel-automation

我想创建一个包装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,我不知道该怎么做。

那么,有没有办法转发声明_com_ptr_t指针,如Excel :: _ ApplicationPtr?或者有更好的方法去做我想做的事情吗?

1 个答案:

答案 0 :(得分:2)

如果你真的想那样做的话。我会创建一个没有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();
}

这只是一种方式......