C ++: связывание функций класса в DLL - PullRequest
2 голосов
/ 01 сентября 2010

Я относительно новичок в импорте DLL и привязке функций.Допустим, у меня есть проект C ++, представляющий собой библиотеку графического интерфейса, полностью написанную на ООП и предназначенную для использования в играх.

Однако мой игровой проект написан на Delphi.Теперь я хочу связать функции Delphi с функциями в DLL.

Я бы знал, как сделать это с простыми функциями, без классов, как в C - но как насчет ООП?

Так что вкратко: Могу ли я связать функции Delphi с функциями в DLL, которая состоит из скомпилированных классов C ++?

Не потеряны ли классы в процессе компиляции?

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Я все еще сталкиваюсь со многими аспектами 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 голос
/ 01 сентября 2010

Классы не обязательно «теряются» при компиляции, но Delphi (вероятно) также не будет знать, что делать с классами C ++.Возможно (недавно я не проверял), что Delphi может использовать / иметь дело с классами C ++, скомпилированными с помощью компилятора Borland / Embarcadero, но он почти наверняка не будет знать, как обращаться с чем-либо, скомпилированным (например, gnu или Microsoft.

Именно поэтому популярны элементы управления ActiveX (и COM в целом) - они позволяют экспортировать класс из DLL, которая соответствует спецификации для двоичного файла интерфейс, позволяющий использовать этот класс (или эти классы) из всего, что знает об ActiveX (и более того, включая почти все).

0 голосов
/ 01 сентября 2010

Это сложно, поскольку C ++ использует совсем другую объектную модель, чем Delphi.Руди Вельтиус написал довольно хорошую статью о том, как этого добиться, используя два разных метода, оба из которых довольно уродливы.

...