简单地说,我有一个需要在DLL之间共享的类库。我想避免将该库导出到单独的DLL中,如果可能的话。
更具体地说,我有一个扩展应该实现的通用接口,并为派生类提供工厂。通过使用纯虚拟类创建公共头文件,这很容易做到。但是,所有派生类都将共享一些实现细节,我希望将它们包含在基类定义中以避免代码重复。
这是一个到目前为止在VC2010中似乎有用的具体示例,但我想确保在涉及不同的编译器时它不会中断。
两个模块共享以下两个文件:
// Object.h
class Object
{
protected:
int x;
public:
Object();
virtual int Foo() = 0;
void Bar();
};
typedef Object* (*ObjectFactory)();
// Object.cpp
Object::Object()
{
x = 0;
}
void Object::Bar()
{
x++;
}
图书馆主要cpp:
#include <windows.h>
#include "object.h"
class Derived : public Object
{
public:
int Foo()
{
return x + 1;
}
};
extern "C" __declspec(dllexport) Object* CreateObject()
{
return new Derived;
}
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved)
{
return TRUE;
}
主要模块:
#include <windows.h>
#include "object.h"
int main()
{
HMODULE module = LoadLibrary("test_dll.dll");
ObjectFactory factory = (ObjectFactory) GetProcAddress(module, "CreateObject");
Object* o = factory();
o->Bar();
int x = o->Foo(); // returns 2, as expected
FreeLibrary(module);
return 0;
}