Как я могу использовать класс 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;
}
Это выглядит немного странно, используя префикс 'I' для обычного класса. Все ожидали бы интерфейса. И интерфейс - это то, что вы должны использовать для этого –
. Я не вижу '__stdcall' в вашем коде на C++. Если вы используете только виртуальные методы и одно и то же соглашение о вызовах с обеих сторон, я считаю, что он должен работать. – kludg
@user Это будет работать только до тех пор, пока компиляторы не выведут VMT одинаковым образом. Нет причин ожидать этого. То, что вызывающий указал методы в разных порядках, не поможет. –