【发布时间】:2014-12-27 11:48:06
【问题描述】:
如何在 Delphi 中使用 C++ 类?我试图通过一个抽象类来使用它。但是它没有按预期工作我从Age(); 得到奇怪的数字。
德尔福:
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看起来有点奇怪。每个人都希望有一个界面。一个接口就是你应该使用的 -
我在您的 C++ 代码中没有看到
__stdcall。如果您在双方都只使用虚拟方法和相同的调用约定,我相信它应该可以工作。 -
@user 只有当编译器碰巧以相同的方式布置 VMT 时,它才会起作用。没有理由期待。调用者以不同的顺序指定方法将无济于事。
-
@John 你为什么要重新发明 COM?
-
你什么时候会意识到你不能这样做?使用 COM 或扁平化接口。
标签: delphi delphi-xe7