2016-09-21 1 views
1

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; 
}; 

이 정적 라이브러리 프로젝트에, 나는 내 프로그램에서 그것이 잘 사용하고 있습니다 : 나는 Excel의 COM과 함께 작동하도록 # import를 메커니즘을 사용하고 , 그래서 지금 내가있다.

중요한 것은 라이브러리의 사용자가 어떻게 구현되는지 숨기고 싶습니다. 구현은 앞으로 변경 될 수 있습니다. 또한 .h 파일에 가져 오기 기능을 사용하면 모든 COM 인터페이스가 라이브러리 사용자에게 노출되므로이를 사용하지 않아도됩니다.

그래서 PImpl 관용구 같은 것을하려고 생각했지만, 적어도 m_app을 앞으로 선언해야합니다. 어떻게해야 할 지 잘 모릅니다.

그래서, Excel :: _ ApplicationPtr과 같은 _com_ptr_t 포인터를 전달하는 방법이 있습니까? 아니면 내가하려는 일을하는 더 좋은 방법이 있습니까?

답변

2

정말 그렇게하고 싶다면. 나는 m_app 포인터가없는 baseclass를 만들 것이다. 모든 기능을 가상으로 유지하십시오. (예, 이것은 기본적으로 "인터페이스"를 만듭니다.) (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

관련 문제