2016-09-21 26 views
1

我想创建一个库来包装Excel自动化并只公开其一些功能。 我使用的#import机制与Excel的COM工作,所以现在我有:如何转发声明_com_ptr_t指针?

// 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指针?还是有更好的方法来做我想做的事情?

回答

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

这只是一种方式...

+0

有时候我觉得自己是一个完全新手......我怎么没有想到这个?我不知道这是否是最好的解决方案,但它应该发生在我身上...... – MikMik