3

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

一种可能的方法是使所有必要的类方法成为virtual(以便 DLL 链接器不需要这些方法的定义)。这种方法的缺点:

  1. 我无法使用new(必须在可执行代码中创建附加函数)在 DLL 代码中创建导出类的对象。
  2. 我必须制作所有这些方法virtual,即使它们不需要这样做virtual

__declspec(dllexport)有一种方法可以使用 Microsoft 的存储类扩展属性将类从 DLL 导出到可执行文件。有没有办法使用相同的技术将类从可执行文件导出到 DLL?

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

4

3 回答 3

3

据我所知,使用 MS VS 的 dllexport 从 exe 导出类或函数并在 DLL 中使用它是可以的。如果您的 DLL 和 Exe在一个进程中执行,它运行起来很酷。

于 2009-02-28T01:18:28.337 回答
2

如果你真的不希望它在第一个 DLL 中,你可以把它放在第二个 DLL 中。

我很难理解您不只是将类放在 DLL 中的原因。

ETA:做了更多的挖掘,发现这个链接解释了如何在 Visual Studio 2008 中从 EXE 项目生成导入库。至于如何导出它们,看起来你只是使用常规的 __declspec(dllexport)。

于 2009-02-27T13:31:40.593 回答
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。这是一个黑客,但它可能会工作。

于 2009-02-28T01:55:51.927 回答