簡體   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