使用C++;Delphi中的类 如何在Delphi中使用C++类?我试图通过一个抽象类来使用它。然而,它并没有像预期的那样工作,我从Age()得到了奇怪的数字

使用C++;Delphi中的类 如何在Delphi中使用C++类?我试图通过一个抽象类来使用它。然而,它并没有像预期的那样工作,我从Age()得到了奇怪的数字,delphi,delphi-xe7,Delphi,Delphi Xe7,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';

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.
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;
}
C++:

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.
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;
}

不能从Delphi与C++类进行互操作。事实上,如果您使用同一编译器和运行时,只能合理地从C++中执行它。p>


<>你需要做的是,在C++和Delphi之间进行交互,就是用COM来公开C++类。如果COM不是一个选项,那么扁平化类是另一种选择。Rudy Velthuis在这里介绍了这些选项:

对于普通类,使用前缀
I
看起来有点奇怪。每个人都希望有一个接口。一个接口就是你在C++代码中不应该看到的代码>代码>如果您只使用虚拟方法,并且双方都使用相同的调用约定,我相信它应该会起作用。@user只有在编译器碰巧以相同的方式布置VMT时,它才会起作用。没有理由期待。调用者以不同的顺序指定方法是没有帮助的。@John你为什么要重新发明COM?你什么时候会意识到你不能这么做?使用COM或展平界面。感谢您的提及!从C(++)端进行扁平化比较容易,而从Delphi端进行COm选项比较容易。