Преглед на файлове

Merged revisions 7106-7108 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

r7106 (florian)
* return proper var* value for variants in tvariantdef.getvardef


r7107 (florian)
* dispatch ref. variants properly when calling idispatch.invoke


r7108 (florian)
* deactivated accidently activated debug switch

git-svn-id: branches/fixes_2_2@7109 -

florian преди 18 години
родител
ревизия
fee89b1c27
променени са 2 файла, в които са добавени 23 реда и са изтрити 3 реда
  1. 7 0
      compiler/symdef.pas
  2. 16 3
      packages/base/winunits/comobj.pp

+ 7 - 0
compiler/symdef.pas

@@ -112,6 +112,7 @@ interface
           function getcopy : tstoreddef;override;
           function GetTypeName:string;override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
+          function  getvardef:longint;override;
           procedure setsize;
           function is_publishable : boolean;override;
           function needs_inittable : boolean;override;
@@ -1847,6 +1848,12 @@ implementation
       end;
 
 
+    function tvariantdef.getvardef : longint;
+      begin
+        Result:=varVariant;
+      end;
+
+
     procedure tvariantdef.setsize;
       begin
 {$ifdef cpu64bit}

+ 16 - 3
packages/base/winunits/comobj.pp

@@ -192,14 +192,14 @@ implementation
        flags:=CLSCTX_LOCAL_SERVER or CLSCTX_REMOTE_SERVER or CLSCTX_INPROC_SERVER;
 
        { actually a remote call? }
-{$ifndef wince}  
+{$ifndef wince}
        //roozbeh although there is a way to retrive computer name...HKLM\Ident\Name..but are they same?
 	     size:=sizeof(localhost);
        if (MachineName<>'') and
           (not(GetComputerNameW(localhost,size)) or
           (WideCompareText(localhost,MachineName)<>0)) then
            flags:=CLSCTX_REMOTE_SERVER;
-{$endif}   
+{$endif}
 
        OleCheck(CoCreateInstanceEx(ClassID,nil,flags,@server,1,@mqi));
        OleCheck(mqi.hr);
@@ -324,9 +324,22 @@ implementation
                         inc(PPointer(Params));
                       end;
                     varVariant:
+                      begin
+{$ifdef DEBUG_COMDISPATCH}
+                        writeln('Got ref. variant containing type: ',PVarData(PPointer(Params)^)^.VType);
+{$endif DEBUG_COMDISPATCH}
+                        if PVarData(PPointer(Params)^)^.VType=varString then
+                          begin
 {$ifdef DEBUG_COMDISPATCH}
-                      writeln('Unimplemented ref variant dispatch');
+                            writeln('  Casting nested varString: ',Ansistring(PVarData(Params^)^.vString));
 {$endif DEBUG_COMDISPATCH}
+                            VarCast(PVariant(Params^)^,PVariant(Params^)^,varOleStr);
+                          end;
+
+                        Arguments[i].VType:=varVariant or varByRef;
+                        Arguments[i].VPointer:=PPointer(Params)^;
+                        inc(PPointer(Params));
+                      end
                     else
                       begin
 {$ifdef DEBUG_COMDISPATCH}