2011-04-01 4 views
0

우리는 응용 프로그램에 대한 DLL 플러그인을 개발하는 경우가 있습니다. 모든 플러그인에는 공통된 소스 파일 세트가 있습니다. 그러나 기본 라이브러리로 분리하려고합니다. 우리는 하나의 DLL 프로젝트에 모두 포함되는 다음 구현을 가지고 있습니다 :분리 기준 : 기본 라이브러리를 만들고 구체적인 클래스에 대한 종속성 제거

// dllentry class 
BaseImporter* spImporter = NULL; 
    extern BaseImporter* createImporterImplementation(const std::string& pDllFileName); 

int __stdcall DllImportOpen(
      const char* pDllFileName, 
      const char** ppImporterUniqueName, 
      const char** ppImporterVersion) 
{ 
    // method implementation in concrete class source file 
    spImporter = createImporterImplementation(pDllFileName); 

    (*ppImporterUniqueName) = spImporter->GetUniqueName(); 
    (*ppImporterVersion) = spImporter->GetImporterVersion(); 
    return (0); 
} 

// base importer class 

class BaseImporter() 
{ 
public: 
    const char* GetUniqueName() const {return mUniqueName.c_str();} 
    const char* GetImporterVersion() const {return mVersion.c_str();} 
protected: 
    // some pure virtual methods here 
} 

// concrete class 
class XImporter : BaseImporter() 
{ 
    // implement base importer 
} 

// resides in XImporter source file 
BaseImporter* createImporterImplementation(
      const std::string& dll_filename) 
{ 
    return new XImporter (dll_filename); 
} 

1 DLL로 함께 빌드하면 잘 작동합니다. 그러나 dllentry 클래스와 BaseImporter을 기본 라이브러리로 분리하고 싶습니다. createImporterImplementation의 구현을 검색 할 때 기본 라이브러리를 컴파일 할 때 링커 오류가 발생합니다. 어떻게하면 콘크리트 라이브러리와 함께 사용할 수있는 기본 라이브러리를 잘 구분할 수 있습니까?

답변

1

하나의 솔루션은 createImporterImplementation에 늦게 바인딩하는 것입니다. (NB, 상세 porbably 잘못된 전혀 테스트하지)

// in base DLL: 
BaseImporter* createImporterImplementation(
     const std::string& dll_filename) 
{ 
    HMODULE h - LoadLIbrary (dll_filename.c_str()); 
    BaseImporter* (*fn)() = GetProcAddress(h, CreateImporterImplementation); 
    return (*fn)(); 
} 

같은 시도 후 콘크리트 수입에 :

__declspec(dllexport) BaseImporter* createImporterImplementation() 
{ 
    return new XImporter; 
} 

않는 질문에 대답?

+0

좋습니다. 나는 그것을 시도 할 것이다. 월요일에 알려 드리겠습니다. – Seth

관련 문제