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