1

我想创建一个库来包装 Excel 自动化并仅公开它的一些巨大功能。我正在使用#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 指针?还是有更好的方法来做我想做的事情?

4

1 回答 1

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();
}

这只是一种方式...

于 2016-09-21T17:35:01.870 回答