Конференция "Corba" » Обращение к удаленном OLE-объекту
 
  • Ломброзо © (07.07.06 12:27) [20]
    Зайти в оснастку "Component Services" (на XP)->Свойства компьютера или dcomcnfg, проверить опцию, разрешающую использование DCOM.
  • GrBob (07.07.06 12:37) [21]
    Аааа, ну это то конечно установлено :)
  • AbrosimovA © (07.07.06 14:44) [22]
    Проверено на методе 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              
         //Connect;
         ISrv:=IDispatch(Value);
       end;
     varEmpty:
       begin
         //Exec;
         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;

  • AbrosimovA © (07.07.06 16:54) [23]
    Не могу найти ответа на следующий вопрос:

    Как программно узнать, что нужно передавать через DispParams для безошибочного выполнения методов  через IDispatch.Invoke
  • имя (09.07.06 20:53) [24]
    Удалено модератором
  • GrBob (11.07.06 12:31) [25]

    > Как программно узнать, что нужно передавать через DispParams
    > для безошибочного выполнения методов  через IDispatch.Invoke

    Советую взглянуть в сторону интерфейсов ITypeLib и ITypeInfo. Сам еще не разобрался, но имхо должно подойти. Мне как раз сейчас это тоже понадобилось, просто времени совсем нет читать, если разберешься, отпишись :)
  • AbrosimovA © (11.07.06 14:27) [26]
    Это дополнение к коду из 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>

 
Конференция "Corba" » Обращение к удаленном OLE-объекту
Есть новые Нет новых   [120341   +1][b:0][p:0.001]