Parcourir la source

* Adapted IUnknown so that it can be used for interfaceing with XPCom, also
on non-Windows systems.
- Always pass TGUID to QueryInterface by reference (constref)
- QueryInterface, _AddRef and _Release use the cdecl calling convention on
non-Windows, just as most c-frameworks (like XPCom)

git-svn-id: branches/xpcom@16009 -

joost il y a 15 ans
Parent
commit
4fb9002b58

+ 6 - 6
packages/fcl-fpcunit/src/testutils.pp

@@ -26,9 +26,9 @@ type
   TNoRefCountObject = class(TObject, IInterface)
   protected
     { IInterface }
-    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
-    function _AddRef: Integer; stdcall;
-    function _Release: Integer; stdcall;
+    function QueryInterface(constref IID: TGUID; out Obj): HResult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+    function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+    function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
   end;
   {$M-}
 
@@ -38,18 +38,18 @@ procedure GetMethodList( AClass: TClass; AList: TStrings ); overload;
 
 implementation
 
-function TNoRefCountObject.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+function TNoRefCountObject.QueryInterface(constref IID: TGUID; out Obj): HResult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   if GetInterface(IID, Obj) then Result := 0
     else Result := HRESULT($80004002);
 end;
 
-function TNoRefCountObject._AddRef: Integer;stdcall;
+function TNoRefCountObject._AddRef: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   Result := -1;
 end;
 
-function TNoRefCountObject._Release: Integer;stdcall;
+function TNoRefCountObject._Release: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   Result := -1;
 end;

+ 7 - 7
rtl/inc/objpas.inc

@@ -967,7 +967,7 @@
 ****************************************************************************}
 
     function TInterfacedObject.QueryInterface(
-      const iid : tguid;out obj) : longint;stdcall;
+      {$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 
       begin
          if getinterface(iid,obj) then
@@ -976,13 +976,13 @@
            result:=longint(E_NOINTERFACE);
       end;
 
-    function TInterfacedObject._AddRef : longint;stdcall;
+    function TInterfacedObject._AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 
       begin
          _addref:=interlockedincrement(frefcount);
       end;
 
-    function TInterfacedObject._Release : longint;stdcall;
+    function TInterfacedObject._Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 
       begin
          _Release:=interlockeddecrement(frefcount);
@@ -1026,19 +1026,19 @@
       end;
 
     function TAggregatedObject.QueryInterface(
-      const iid : tguid;out obj) : longint;stdcall;
+      {$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 
       begin
          Result := IUnknown(fcontroller).QueryInterface(iid, obj);
       end;
 
-    function TAggregatedObject._AddRef : longint;stdcall;
+    function TAggregatedObject._AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 
       begin
          Result := IUnknown(fcontroller)._AddRef;
       end;
 
-    function TAggregatedObject._Release : longint;stdcall;
+    function TAggregatedObject._Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 
       begin
          Result := IUnknown(fcontroller)._Release;
@@ -1055,7 +1055,7 @@
 ****************************************************************************}
 
     function TContainedObject.QueryInterface(
-            const iid : tguid;out obj) : longint; stdcall;
+            {$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 
     begin
       if getinterface(iid,obj) then

+ 10 - 10
rtl/inc/objpash.inc

@@ -243,9 +243,9 @@
 
        IUnknown = interface
          ['{00000000-0000-0000-C000-000000000046}']
-         function QueryInterface(const iid : tguid;out obj) : longint;stdcall;
-         function _AddRef : longint;stdcall;
-         function _Release : longint;stdcall;
+         function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+         function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+         function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
        end;
        IInterface = IUnknown;
 
@@ -283,9 +283,9 @@
        protected
           frefcount : longint;
           { implement methods of IUnknown }
-          function QueryInterface(const iid : tguid;out obj) : longint;stdcall;
-          function _AddRef : longint;stdcall;
-          function _Release : longint;stdcall;
+          function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+          function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+          function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
         public
           procedure AfterConstruction;override;
           procedure BeforeDestruction;override;
@@ -300,9 +300,9 @@
           function GetController: IUnknown;
        protected
           { implement methods of IUnknown }
-          function QueryInterface(const iid : tguid;out obj) : longint;stdcall;
-          function _AddRef : longint;stdcall;
-          function _Release : longint;stdcall;
+          function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+          function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+          function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
        public
           constructor Create(const aController: IUnknown);
           property Controller : IUnknown read GetController;
@@ -310,7 +310,7 @@
 
        TContainedObject = class(TAggregatedObject,IInterface)
          protected
-           function QueryInterface(const iid : tguid;out obj) : longint;virtual; stdcall;
+           function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
          end;
 
        { some pointer definitions }

+ 6 - 6
rtl/inc/variants.pp

@@ -161,9 +161,9 @@ type
   private
     FVarType: TVarType;
   protected
-    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
-    function _AddRef: Integer; stdcall;
-    function _Release: Integer; stdcall;
+    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+    function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+    function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
     procedure SimplisticClear(var V: TVarData);
     procedure SimplisticCopy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean = False);
     procedure RaiseInvalidOp;
@@ -3575,19 +3575,19 @@ function Null: Variant;       // Null standard constant
   ---------------------------------------------------------------------}
 
 {$warnings off}
-function TCustomVariantType.QueryInterface(const IID: TGUID; out Obj): HResult;  stdcall;
+function TCustomVariantType.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult;  {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
   begin
     NotSupported('TCustomVariantType.QueryInterface');
   end;
 
 
-function TCustomVariantType._AddRef: Integer; stdcall;
+function TCustomVariantType._AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
   begin
     NotSupported('TCustomVariantType._AddRef');
   end;
 
 
-function TCustomVariantType._Release: Integer; stdcall;
+function TCustomVariantType._Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
   begin
     NotSupported('TCustomVariantType._Release');
   end;

+ 6 - 6
rtl/objpas/classes/classesh.inc

@@ -403,10 +403,10 @@ type
     FOwnerInterface: IInterface;
   protected
     { IInterface }
-    function _AddRef: Integer; stdcall;
-    function _Release: Integer; stdcall;
+    function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+    function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
   public
-    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
+    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
     procedure AfterConstruction; override;
   end;
 
@@ -1622,9 +1622,9 @@ type
     procedure ValidateContainer(AComponent: TComponent); dynamic;
     procedure ValidateInsert(AComponent: TComponent); dynamic;
     { IUnknown }
-    function QueryInterface(const IID: TGUID; out Obj): Hresult; virtual; stdcall;
-    function _AddRef: Integer; stdcall;
-    function _Release: Integer; stdcall;
+    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): Hresult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+    function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+    function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
     function iicrGetComponent: TComponent;
     { IDispatch }
     function GetTypeInfoCount(out Count: Integer): HResult; stdcall;

+ 3 - 3
rtl/objpas/classes/compon.inc

@@ -652,7 +652,7 @@ begin
     Result := False;
 end;
 
-function TComponent.QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
+function TComponent.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   if Assigned(VCLComObject) then
     Result := IVCLComObject(VCLComObject).QueryInterface(IID, Obj)
@@ -663,7 +663,7 @@ begin
     Result := E_NOINTERFACE;
 end;
 
-function TComponent._AddRef: Integer;stdcall;
+function TComponent._AddRef: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   if Assigned(VCLComObject) then
     Result := IVCLComObject(VCLComObject)._AddRef
@@ -671,7 +671,7 @@ begin
     Result := -1;
 end;
 
-function TComponent._Release: Integer;stdcall;
+function TComponent._Release: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   if Assigned(VCLComObject) then
     Result := IVCLComObject(VCLComObject)._Release

+ 3 - 3
rtl/objpas/classes/persist.inc

@@ -91,7 +91,7 @@ begin
 end;
 
 
-function TInterfacedPersistent._AddRef: Integer;stdcall;
+function TInterfacedPersistent._AddRef: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   if assigned(FOwnerInterface) then
     Result:=FOwnerInterface._AddRef
@@ -100,7 +100,7 @@ begin
 end;
 
 
-function TInterfacedPersistent._Release: Integer;stdcall;
+function TInterfacedPersistent._Release: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   if assigned(FOwnerInterface) then
     Result:=FOwnerInterface._Release
@@ -109,7 +109,7 @@ begin
 end;
 
 
-function TInterfacedPersistent.QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
+function TInterfacedPersistent.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
 begin
   if GetInterface(IID, Obj) then
     Result:=0