2014-12-27 5 views
2

Как я могу использовать класс C++ в Delphi? Я пытаюсь использовать его через абстрактный класс. Однако он не работает, как ожидалось, я получаю странные цифры от Age();.Использование классов C++ в Delphi

Delphi:

program Test; 

{$APPTYPE CONSOLE} 

type 
    IPerson = class 
    function Age(): Integer; overload; virtual; stdcall; abstract; 
    procedure Age(const Value: Integer); overload; virtual; stdcall; abstract; 
    end; 

const 
    DLL = 'Interface.DLL'; 

procedure FreePerson(const Person: IPerson); external DLL; 
function CreatePerson(): IPerson; external DLL; 

var 
    Person: IPerson; 
    I: Integer; 
begin 
    Person := CreatePerson; 
    Person.Age(10); 
    I := Person.Age(); // I is not 10? 

end. 

C++:

extern "C" class _declspec(dllexport) IPerson 
{ 
    virtual void Age(const int Value) = 0; 
    virtual int Age() = 0; 
}; 


class Person: public IPerson 
{ 
private: 
    int FAge; 
public: 
    void Age(const int Value){FAge = Value;}; 
    int Age(){return FAge;}; 
    Person(){ FAge = 0; }; 
    ~Person(){}; 
}; 


extern "C" _declspec(dllexport) IPerson* CreatePerson() 
{ 
    return new Person; 
} 

extern "C" _declspec(dllexport) void FreePerson(Person** obj) 
{ 
    delete obj; 
} 
+1

Это выглядит немного странно, используя префикс 'I' для обычного класса. Все ожидали бы интерфейса. И интерфейс - это то, что вы должны использовать для этого –

+0

. Я не вижу '__stdcall' в вашем коде на C++. Если вы используете только виртуальные методы и одно и то же соглашение о вызовах с обеих сторон, я считаю, что он должен работать. – kludg

+1

@user Это будет работать только до тех пор, пока компиляторы не выведут VMT одинаковым образом. Нет причин ожидать этого. То, что вызывающий указал методы в разных порядках, не поможет. –

ответ

4

Вы не можете Interop с классами C++ из Delphi. Фактически, вы можете только разумно сделать это с C++, если используете один и тот же компилятор и время выполнения.

Что нужно сделать, чтобы взаимодействовать между C++ и Delphi, заключается в том, чтобы разоблачить ваши классы C++ с помощью COM. Если COM не является опцией, то выравнивание класса является альтернативой. Rudy Velthuis использует эти опции здесь: http://rvelthuis.de/articles/articles-cppobjs.html

+0

Спасибо за упоминание! Сплющивание легче со стороны C (++), опция COm проще для стороны Delphi. –

Смежные вопросы