C ++:DLL中的绑定类函数

时间:2010-09-01 15:52:13

标签: c++ delphi dll binding

我对DLL导入和函数绑定相对较新。假设我有一个C ++项目,它是一个完全用OOP编写的GUI库,旨在用于游戏。

我的游戏项目是用Delphi编写的。我现在想将Delphi函数绑定到DLL中的函数。

我知道如何使用简单的函数执行此操作,而不使用C语言中的类 - 但是OOP呢?

简而言之:我可以将Delphi函数绑定到由编译的C ++类组成的DLL中吗?

编译过程中是否没有丢失类?

3 个答案:

答案 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,,这两种方法都有点难看。