Я хочу создать библиотеку, чтобы обернуть 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? Или есть лучший способ сделать то, что я пытаюсь сделать?
Если вы действительно хотите сделать это таким образом. Я хотел бы создать базовый класс, который не имеет указатель 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();
}
Это только один из способов …
Других решений пока нет …