Как переадресовать-объявить _com_ptr_t указатели?

Я хочу создать библиотеку, чтобы обернуть Excel Automation и раскрыть лишь некоторые из ее обширных функциональных возможностей.
Я использую механизм #import для работы с COM в Excel, поэтому сейчас у меня есть:

// 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? Или есть лучший способ сделать то, что я пытаюсь сделать?

1

Решение

Если вы действительно хотите сделать это таким образом. Я хотел бы создать базовый класс, который не имеет указатель 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();
}

Это только один из способов …

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]