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;