我们有一种情况,我们为应用程序开发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的实现。如何很好地分离可与具体库一起使用的基础库?

最佳答案

一种解决方案是后期绑定createImporterImplementation。尝试类似的操作(注意,根本没有经过测试,可能是错误的详细信息)

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


这能回答问题吗?

关于c++ - 关注点分离:创建基础库并删除对具体类的依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5509655/

10-11 01:51