Further reading on some limited portability of C++ classes into Delphi:

http://www.rvelthuis.de/articles/articles-cppobjs.html

Take a specific look at the second part, with pure virtual classes. The trouble is it only works for virtual C++ classes (have at least on virtual function - hence a VMT) with single inheritance (single VMT with virtual functions at offset 0). The C++ dll must provide a factory function and a wrapper for deleting the class. No further extension of this class is possible in Delphi.


On Mon, 22 Jan 2007 13:17:48 -0600, Felipe Monteiro de Carvalho <[EMAIL PROTECTED]> wrote:

Hello,

I was studing how to write the system unit for Symbian OS, and
everything on Symbian is C++, so you actually import lot´s of methods
from classes, not procedures. So I decided to study the task of
linking from Free Pascal to C++

Maybe it´s easy to be implemented, and that would be very nice. Here is my test:

To start with I created a trivial C++ DLL:

File: cpplib.cpp

class User
{
  public:
     __declspec(dllexport) int Sum(int a, int b);
};

int User::Sum(int a, int b)
{
    return a + b;
}

File: build.bat

PATH=C:\Programas\Dev-Cpp\bin
g++ -c cpplib.cpp -o cpplib.o
dllwrap.exe --output-def cpplib.def --driver-name c++ --implib
cpplib.a cpplib.o -L"c:/Programas/dev-cpp/lib" --no-export-all-symbols
--add-stdcall-alias -o cpplib.dll

Calling build.bat will of course produce cpplib.dll It also produces a
cpplib.def

Now, I utilized dllview software I created and saw that cpplib exports
this function: _ZN4User3SumEii

Then, I created a simple pascal software to call that function:

program loadcpp;

{$mode objfpc}{$H+}

{$apptype console}

uses
  SysUtils, ctypes;

function User_Sum(Self: Pointer; a, b: cint): cint; cdecl; external
'cpplib.dll' name '_ZN4User3SumEii';

begin
  WriteLn('7 + 8 = ' + IntToStr(User_Sum(nil, 7, 8)));
end.

And it works!

So, basically, what I mean with this is: What is needed to add C++
linking to Free Pascal? It seams to me that it should be easy, we just
need to understand C++ name mangling and choose a sintax to implement
it. Maybe something like this:

type
  User = class
  public:
    function Sum(a, b: cint): cint; cdecl; external 'cpplib.dll';
cpp_name_mangling;
  end;

One possible problem is C++ multiple inheritance. I would propose
that, to start with, just disconsider it.

Disclaimer: I know very little on the subject, so feel free to correct me =)

thanks,



--
|***********************************************|
|                                               |
|  Peter Popov,                                 |
|                                               |
|  608N Blocker Bldg.                           |
|  Institute for Scientific Computation,        |
|  Texas A&M University                         |
|  College Station, Texas 77843-3404            |
|-----------------------------------------------|
|  Phone: +1 (979) 458-4644,                    |
|  Fax: +1 (979) 845-5827                       |
|                                               |
|***********************************************|
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to