我对DLL导入和函数绑定相对较新。假设我有一个C ++项目,它是一个完全用OOP编写的GUI库,旨在用于游戏。
我的游戏项目是用Delphi编写的。我现在想将Delphi函数绑定到DLL中的函数。
我知道如何使用简单的函数执行此操作,而不使用C语言中的类 - 但是OOP呢?
简而言之:我可以将Delphi函数绑定到由编译的C ++类组成的DLL中吗?
编译过程中是否没有丢失类?
答案 0 :(得分:3)
我仍然需要掌握C ++的许多方面,但希望以下内容具有某种意义。
我认为C ++的某些方面不会通过纯粹的基于DLL导入的机制很好地转换。例如,我认为你不能支持多态或方法重载。
但是,这并不意味着您无法使用课程。我认为传达这种方法可能起作用的最简单方法是玩具示例。
//Start with a class definition
class foo
{
int bar = 0;
int getBar();
};
// Now create a C API that you can access from Delphi
extern "C" {
void *createFoo()
{
return new foo();
}
int getBar(void *fooInstance)
{
foo *fooObj = (foo*)fooInstance;
return fooObj->getBar();
}
} // end of extern "C"
然后将extern "C"
函数导出到delphi并使用它们。
我没有编译器方便测试,并且可能存在错误,但希望有足够的信息可以传达这个概念。如果有任何严重错误,请告诉我,我会解决。
答案 1 :(得分:1)
编译时类不一定“丢失”,但Delphi(可能)也不知道如何处理C ++类。有可能(我最近没有检查过)Delphi可以使用/处理用Borland / Embarcadero编译器编译的C ++类,但几乎可以肯定不会知道如何处理编译的任何东西(例如)gnu或Microsoft。
这就是为什么ActiveX控件(以及一般的COM)很流行的原因 - 它们允许您从遵循二进制接口规范的DLL导出类,允许该类(或其他任何知道ActiveX的东西(以及几乎包括所有东西的东西)。
答案 2 :(得分:0)
这很棘手,因为C ++使用的对象模型与Delphi完全不同。 Rudy Velthius用两种不同的方法写了a pretty good article on how to accomplish it,,这两种方法都有点难看。