将类从可执行文件导出到dll

时间:2009-02-27 13:21:39

标签: c++ dllimport

我需要在DLL中使用在可执行文件中定义的类(DLL和可执行文件由同一编译器编译)。但我不希望这个类定义的源代码可用于DLL,只能声明。

一种可能的方法是将所有必需的类方法设为virtual(这样DLL链接器就不需要这些方法的定义)。这种方法的缺点是:

  1. 我无法创建导出类的对象 在DLL代码中使用new(必须 创建其他功能 可执行代码)。
  2. 我必须制作所有这些方法virtual, 即使否则他们不需要 是virtual
  3. 有一种方法可以使用Microsoft的__declspec(dllexport)存储类扩展属性将类从DLL导出到可执行文件。 有没有办法使用相同的技术将类从可执行文件导出到DLL?

    我的旧Borland C 6编译器不允许我在可执行项目的构建期间创建导入库。 (因此,在编译DLL时,链接器为所有导入的非虚方法方法提供了未解析的外部错误消息。)这是对这个编译器的限制,还是我错过了一些重要的东西?

3 个答案:

答案 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之外。这是一个黑客,但它可能会有效。