繁体   English   中英

如何向前声明_com_ptr_t指针?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM