【问题标题】:Using C++ Classes in Delphi在 Delphi 中使用 C++ 类
【发布时间】: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


【解决方案1】:

您不能与 Delphi 中的 C++ 类进行互操作。事实上,如果你使用相同的编译器和运行时,你只能从 C++ 合理地做到这一点。

要在 C++ 和 Delphi 之间进行互操作,您需要做的是使用 COM 公开您的 C++ 类。如果 COM 不是一个选项,那么扁平化类是另一种选择。 Rudy Velthuis 在这里介绍了这些选项:http://rvelthuis.de/articles/articles-cppobjs.html

【讨论】:

  • 感谢您的提及!扁平化从 C(++) 端更容易,COM 选项在 Delphi 端更容易。
猜你喜欢
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多