我需要在DLL中使用在可执行文件中定义的类(DLL和可执行文件由同一编译器编译)。但我不希望这个类定义的源代码可用于DLL,只能声明。
一种可能的方法是将所有必需的类方法设为virtual
(这样DLL链接器就不需要这些方法的定义)。这种方法的缺点是:
new
(必须
创建其他功能
可执行代码)。 virtual
,
即使否则他们不需要
是virtual
。有一种方法可以使用Microsoft的__declspec(dllexport)
存储类扩展属性将类从DLL导出到可执行文件。
有没有办法使用相同的技术将类从可执行文件导出到DLL?
我的旧Borland C 6编译器不允许我在可执行项目的构建期间创建导入库。 (因此,在编译DLL时,链接器为所有导入的非虚方法方法提供了未解析的外部错误消息。)这是对这个编译器的限制,还是我错过了一些重要的东西?
答案 0 :(得分:3)
据我所知,可以使用MS VS的dllexport从exe中导出类或函数并在DLL中使用它。如果您的DLL和Exe在一个进程中执行 ,它会运行得很酷。
答案 1 :(得分:2)
如果您真的不想在第一个DLL中使用它,可以将该类放在第二个DLL中。
我很难理解你的推理,不仅仅是把类放在DLL中。
ETA:进行了一些挖掘并找到this link,解释了如何从Visual Studio 2008中的EXE项目生成导入库。至于如何导出它们,它看起来像你只需使用常规的__declspec(dllexport)。
答案 2 :(得分:0)
好的,根据这里的新信息给出新答案。如果您无法使用编译器为您的EXE生成导出库,并且您真的必须这样做,那么这是一个富有创意,hacky且通常不推荐的解决方案:
第1步:为你的类创建一个C包装API,有点像这样(可能不会编译,但你明白了):
// Yes, need some 32 bit/64 bit checks here
#define MYHANDLE unsigned int
__declspec(dllexport) MYHANDLE MyClassNewInstance() {
MyClass* ptr = new MyClass();
return (MYHANDLE)ptr;
}
__delspec(dllexport) MyClassDoSomething( MYHANDLE handle, int parm ) {
MyClass* ptr = (MyClass*)handle;
ptr->DoSomething(parm);
}
etc..
步骤2:要实际从EXE获取C函数以便在DLL中使用,请使用Win32 API函数GetModuleHandle()和GetProcAddress()。
步骤3:在DLL中创建代理类。代理类中的方法什么都不做,只能从EXE中调用它们的对应C函数。
这将使您的类的“真实”实现保持在DLL之外。这是一个黑客,但它可能会有效。