> On 03/31/11 15:00, Kjell Rilbe wrote:
>> Generally speaking, I feel it's completely wrong to add something to
>> an api only because some clients/users would expect it, unless it
>> actually does something useful in the api. it will only lead to extra
>> complexity and problems down the line.
>>
>> So, if the only reason to add queryInterface is to make Delphi users'
>> life easier I'd say no, even if I've been a huge Delphi fan ever since
>> version 1.
> 
> BTW, what's a problem with writing using Delphi code RAII type for our
> interface without built-in into compiler support?

    It is not a *big* problem, no. But it will be very convenient. See 
simplified 
example below :

1. Not compatible with IUnknown.

a) Our public header

class Interface
{
    virtual int _cdecl addRef() = 0;
    virtual int _cdecl release() = 0;
};

class IFoo : public Interface
{
    virtual void _cdecl xxx() = 0;
};


b)  Delphi declarations

type
  IFBInterface = class
    function addRef : Integer; abstract; cdecl;
    function release : Integer; abstract; cdecl;
  end;

  IFoo = class(IFBInterface)
    procedure xxx; abstract; cdecl;
  end;

  TFBInterface = class(TInterfacedObject, IFBInterface)
   private:
    // IInterface overloads
    function _AddRef : Integer; 
    function _Release : Integer;

    // IFBInterface methods
    function addRef : Integer; 
    function release : Integer; 

    FFBIntf : IFBInterface;
  public:
    constructor Create(AFBIntf : IFBInterface);
  end;

  TFoo = class (TFBInterface, IFoo)
  private:
    FFoo : IFoo;
  public
    constructor Create(AFoo : IFoo);

    // IFoo methods
    procedure xxx; 
  end;


function TFBInterface._AddRef : Integer; 
begin
  return addRef;
end;

function TFBInterface._Release : Integer; 
begin
  return release;
end;

function TFBInterface.addRef : Integer; 
begin
  return FFBIntf.addRef;
end;

function TFBInterface.release : Integer; 
begin
  return FFBIntf.release;
end;

c) Delphi code example :

var
    aFoo : IFoo;
begin
    aFoo := TFoo.Create( fbGetMeFoo; )
    aFoo.xxx;
end



2. If we became compatible with IUnknown

a) Our public header

class Interface
{
    virtual int _stdcall queryInterface(...) = 0;
    virtual int _stdcall addRef() = 0;
    virtual int _stdcall release() = 0;
};

class IFoo : public Interface
{
    virtual void _stdcall xxx() = 0;
};

b)  Delphi declarations

  IFoo = interface (IInterface)
    procedure xxx; stdcall;
  end;

c) Delphi code example :

var
    aFoo : IFoo;
begin
    aFoo := fbGetMeFoo; 
    aFoo.xxx;
end


Regards,
Vlad

------------------------------------------------------------------------------
Create and publish websites with WebMatrix
Use the most popular FREE web apps or write code yourself; 
WebMatrix provides all the features you need to develop and 
publish your website. http://p.sf.net/sfu/ms-webmatrix-sf
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to