我想知道是否可以在我的 C 代码中加载用 C++ 编写的 DLL。
是的,只要满足所有运行时要求,您就可以使用 C 代码加载共享对象(或动态链接库),无论使用哪种语言创建它。
DLL 语言依赖吗?
共享对象本身是某种格式的二进制文件(即在 Linux 上它是ELF)。它与创建它的语言无关。例如,理论上您可以在十六进制编辑器中编写一个 DLL,这样就不会有创建它的“语言”。
那叫 C++ DLL 或 C DLL 或 C# DLL 吗?
例如,如果您知道某个 DLL 是通过编译 C++ 代码创建的,那么理论上您可以将其称为 «C++ DLL»。或者,如果它依赖于 C++ 特定的运行时库。但是,从系统的角度来看,它仍然是一个可执行的二进制对象,系统并不关心使用什么语言和/或编译器(如果有的话)来创建它。
……这是否意味着我们只能在同一种语言的代码中调用 DLL?
不。
我在网上搜索了一下,发现了一些关于在 C++ 环境中调用 C 的内容。
您需要了解描述计算机程序与操作系统或其他程序之间的低级接口的应用程序二进制接口 (ABI) 。对于 C++,除此之外,您还需要知道符号名称是如何被破坏的,正在使用什么异常机制。这取决于特定的机器/操作系统/编译器组合。
如果您知道这一点并且您的 «C++ DLL» 是可加载和可执行的(即所有运行时依赖项都存在),您几乎可以在 C 程序中托管该 DLL(即使没有该 DLL 通过 «extern "C" 提供 C 接口) » 声明)。例如,知道对象(即类)的大小、布局要求、错位的构造函数/析构函数名称(如果有),您就可以分配内存并构造该对象。然后,如果您知道方法名称的错位以及 «this» 指针是如何传递的,您就可以调用它们。
不要这样做!
话虽如此,这绝对是您需要尝试做的最后一件事。获得与该 DLL 的 ABI 匹配的适当 C++ 编译器,获得描述您要使用的接口的头文件并像普通人一样使用它要容易得多。自己实现该 DLL 的功能甚至比尝试破解更容易。所以,请尝试其他方法。正如好心人已经在评论中建议的那样——“问谁给了你 DLL 使用 DLL 的正确方法是什么”
祝你好运!