-
Зайти в оснастку "Component Services" (на XP)->Свойства компьютера или dcomcnfg, проверить опцию, разрешающую использование DCOM.
-
Аааа, ну это то конечно установлено :)
-
Проверено на методе Add интерфейса Documents объекта Word.Application - работает. var iSrv: IDispatch;
DID: integer;
Value: OleVariant;
DID:=StrToInt(ListView2.Selected.Caption);
Value:=GetDispIDFromName(iSrv, ListView2.Items[iIndex].SubItems[0], DID);
case VarType(Value) of
varDispatch:
begin
ISrv:=IDispatch(Value);
end;
varEmpty:
begin
try
SetInvokeMethod(iSrv,DID);
except
on E: Exception do begin
StatusBar1.SimpleText:=E.Message;
end
end
end;
end;
procedure SetInvokeMethod(const Dispatch: IDispatch; const ID: integer);
var
DispParams: TDispParams;
Args: array[0..1] of TVariantArg;
ExcepInfo : TExcepInfo;
iError : UINT;
begin
Args[0].vt:= VT_ERROR;
Args[0].scode := DISP_E_PARAMNOTFOUND;
Args[1].vt:= VT_ERROR;
Args[1].scode := DISP_E_PARAMNOTFOUND;
FillChar(DispParams, SizeOf (DispParams), 0);
with DispParams do begin
rgvarg := @Args;
cArgs := 2;
cNamedArgs := 0;
end;
OleCheck (Dispatch.Invoke(ID, GUID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, DispParams, nil, @ExcepInfo, @iError));
end;
-
Не могу найти ответа на следующий вопрос:
Как программно узнать, что нужно передавать через DispParams для безошибочного выполнения методов через IDispatch.Invoke
-
Удалено модератором
-
> Как программно узнать, что нужно передавать через DispParams > для безошибочного выполнения методов через IDispatch.Invoke
Советую взглянуть в сторону интерфейсов ITypeLib и ITypeInfo. Сам еще не разобрался, но имхо должно подойти. Мне как раз сейчас это тоже понадобилось, просто времени совсем нет читать, если разберешься, отпишись :)
-
Это дополнение к коду из 5-го поста для процедуры procedure EnumInterface(Dispatch: IDispatch; Entries: TStrings; Functions: Boolean); : type TArgInfo = record
Total: integer;
Optional: integer;
ArgsType: array[0..100] of TVARTYPE;
end;
var ArgInfo: array of TArgInfo;
SetLength(ArgInfo,TypeAttr.cFuncs);
ArgInfo[iMethod].Total:=FuncDesc.cParams;
ArgInfo[iMethod].Optional:=FuncDesc.cParamsOpt;параметров
for i:=0 to FuncDesc.cParams-1 do ArgInfo[iMethod].ArgsType[i]:=TVARTYPE(FuncDesc.lprgelemdescParam[i].tdesc.vt);< /CODE>
|