Notes
Компилятор DTC имеет ошибку при генерации функций-заглушек для методов с out параметрами. Править компилятор лень, но есть рецепт ручного лечения.
Итак, в функции с out параметрами, все out аргументу обявлятся как VAR.
Было:
## Код:
```
PROCEDURE (this: IS7ProSim) ReadFlagValue* (ByteIndex: INTEGER; BitIndex: INTEGER; DataType: PointDataTypeConstants; pData: CtlT.Any), NEW;
```

Стало:
## Код:
```
PROCEDURE (this: IS7ProSim) ReadFlagValue* (ByteIndex: INTEGER; BitIndex: INTEGER; DataType: PointDataTypeConstants; VAR pData: CtlT.Any), NEW;
```

Для всех out-аргументов вызывается функция
## Код:
```
CtlC.RefAnyVar(arg[<i>], arg[<i>]);
```

Где <i> - номер аргумента.
После вызова функции
## Код:
```
CtlC.CallParMethod(this, 26, arg, NIL);
```

Добавляется код:
## Код:
```
pData := CtlC.VarAny(arg[<i>]);
ASSERT(pData # NIL);
```

И самое главное - правится процедура CtlC.CallParMethod(...);
## Код:
```
PROCEDURE CallParMethod* (obj: CtlT.Object; id: INTEGER; VAR arg: ARRAY OF CtlT.Variant;
                                 OUT [nil] ret: CtlT.Variant);
      VAR 
         res: COM.RESULT; 
         par: WinOleAut.DISPPARAMS; 
         param: INTEGER; 
         error: WinOleAut.EXCEPINFO;
         refPars: ARRAY 50 OF WinOleAut.VARIANTARG;
         cntRefs: INTEGER;
         i, j: INTEGER;
   BEGIN
      par.rgvarg := arg; par.cNamedArgs := 0; par.cArgs := LEN(arg);
      
      FOR i:=0 TO par.cArgs-1 DO
         IF BITS(par.rgvarg[i].vt) * BITS(WinOle.VT_BYREF) # {} THEN
            par.rgvarg[i].u.pvarVal := SYSTEM.ADR(refPars[i]);
         END;
      END;
      res := obj.disp.Invoke(id, nullid, CtlT.lcid, 1, par, ret, error, param);
      IF res < 0 THEN ShowError(res, error, par.cArgs - param) END;
      FOR i:=0 TO par.cArgs-1 DO
         IF BITS(par.rgvarg[i].vt) * BITS(WinOle.VT_BYREF) # {} THEN
            arg[i] := par.rgvarg[i].u.pvarVal;
         ELSE
            res := WinOleAut.VariantClear(par.rgvarg[i])   
         END;            
      END;
   END CallParMethod;
```
