从Delphi创建导出的C++类的实例

Ato*_*ian 3 c++ delphi dllimport

我跟随了Rudy Velthuis关于在DLL中使用C++类的优秀文章.一切都很好,除了我需要访问一些在C++ DLL中没有相应工厂的类.如何在DLL中构造类的实例?有问题的类定义为

class __declspec(dllexport) exampleClass
{
public:
  void foo();
};
Run Code Online (Sandbox Code Playgroud)

现在没有工厂,我没有明确的方法来实例化类,但我知道它可以完成,因为我已经看到了使这些类可用于Python的SWIG脚本(.i文件).如果Python和SWIG可以做到,那么我假设/希望有一些方法可以在Delphi中实现它.

现在我对SWIG知之甚少,但它似乎为C++错位名称生成某种映射?那附近哪儿好吗?看看DLL的导出,我想我可以直接通过索引或错误的名称来访问函数和构造函数/析构函数,但这样会很讨厌; 它会工作吗?即使我可以调用构造函数,我该怎么做相当于"new CClass();" 在德尔福?

小智 7

swig的工作方式是:1)它为每个类方法创建一个平面API,并构建类工厂/驱逐舰函数.例如:

class C { 
      public : 
           C() {...}
           int M1(int P1) {...}
        } 
Run Code Online (Sandbox Code Playgroud)

它产生:

       C* New_C();
       Destroy_C(C*self);
       int C_M1(C*self,int P1) {}
Run Code Online (Sandbox Code Playgroud)

平面api必须在一个新的DLL中编译

2)它为平面api生成一个包含pascal中的平面api声明的单元3)平面pascal api可以选择性地用于自动构建Pascal类,例如:

 type TC = class


 private

      FObj : pointer;
 public

      constructor Create();
      destructor Destroy(); override;
      function m1(p1:integer: integer;
    ...

  constructor TC.Create();
  begin
     inherited;
     FObj := New_C();
  end;

  destructor TC.Destroy();
  begin
      Destroy_C(FObj);
      inherited;
  end;

  function TC.M1(P1:integer) : integer;
  begin
      Result := C_M1(FObj, P1);
 end;
Run Code Online (Sandbox Code Playgroud)


小智 5

可以使用SWIG进行.至少应该是可能的.我编写了一个针对ObjectPascal的SWIG模块,我在自己的项目中成功使用它.我已经转换了GEOS和GDAL/OGR库.我在SWIG存储库中也有一个分支,但我仍然需要完成构建所有测试套件的最后步骤并修复类型映射以使模块被接受.

有人想帮忙吗?

Stefano Moratto stefano.moratto@gmail.com www.csiat.it


rep*_*vsd 5

正确的方法是编写一个包装器DLL,为您需要的类公开工厂.

我不确定SWIG的工作原理,但任何依赖逆向工程改名的东西似乎都是一种可疑的方法.

此外,C++对象应该只在C++代码中创建.您应该将对象创建语义留给C++运行时.

COM存在的原因.正是为了使这个跨语言对象隐喻整齐地工作.

我写了几十个从Delphi,python和C#调用的COM对象