我们有一种情况,我们为应用程序开发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
的实现。如何很好地分离可以与具体库一起使用的基础库?
答案 0 :(得分:1)
一种解决方案是后期绑定到createImporterImplementation。尝试类似的东西(NB,根本没有测试,详细可能错误)
// 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;
}
这会回答这个问题吗?