2016-09-21 6 views
1

Я хочу создать библиотеку для автоматизации Excel Automation и выставить только некоторые из ее обширных функций. Я использую механизм #import для работы с COM Excel, так что теперь у меня есть:Как переадресовать _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, и я понятия не имею, как это сделать.

Итак, есть ли способ переслать объявления _com_ptr_t, такие как Excel :: _ ApplicationPtr? Или есть лучший способ сделать то, что я пытаюсь сделать?

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^