Конференция "Corba" » Idispatch OLE, вызов функций [D7, WinXP]
 
  • 312Kbps (06.11.06 22:17) [0]
    Подскажите пожалуйста, имея idispatch я могу получить ole этого объекта ?
    или выполнить его метод ?

    Спасибо !
  • Percent (06.11.06 22:21) [1]
    получить ole этого объекта

    Получить, простите, что?!

    или выполнить его метод

    <интерфейсная ссылка>.<метод>(<параметры>)

    Только вот, у IDispatch - не так много методов, которые можно вызвать.
    Гораздо практичнее - получить нужный интерфейс, и вызывать  его методы.
  • 312Kbps (06.11.06 22:29) [2]
    подскажи , как получить нужный интерфейс, и вызывать  его методы ?

    есть 1C, в своей проге я плучаю его IDispatch , как выполнить команду 1С ?

    p.s. есть handle 1C (если надо конечно).
  • guav © (06.11.06 22:36) [3]
    var
      Disp: IDispatch;
      V: Variant;
    begin
      ...
      V := Disp;
      V.SomeMethod(Val1, Val2);
      V.SomeMethodNamedArguments(parameter1 := Val1, parameter1 := Val2);
      V.SomeProperty := SomeVaule
      ...

  • 312Kbps (06.11.06 22:46) [4]
    можно ли получить список методов которые есть ?
  • 312Kbps (06.11.06 23:19) [5]
    например в 1С есть функция "КаталогИБ()"  которая возращает путь к каталогу базы

    как мне её выполнить имея  IDispatch ?
  • guav © (06.11.06 23:32) [6]

    > [5] 312Kbps   (06.11.06 23:19)

    Так пробовал ?
    var
     Disp: IDispatch;
     V: Variant;
    begin
     V := Disp;
     V.КаталогИБ();
    end;

  • 312Kbps (06.11.06 23:38) [7]
    Пробавал, не получается (((
    Ошибка ;
    "Project 1cv7s.exe raised exception class EOleError with massage method 'КаталогИБ' not supported by automation object"  (

    что можно сделать ? даже и не знаю где искать (
  • Percent (06.11.06 23:45) [8]
    Какие интерфейсы поддерживает 1C?
    Модуль(и) с декларациями поддерживаемых интерфейсов есть?
  • 312Kbps (06.11.06 23:54) [9]
    не знаю что тебе ответить (((

    можно селать так
    Ole1C: Olevariant;
    .....
    Ole1C:=CreateOleObject('V1СEnterprise.Application');
    Ole1C.Initialize(.....);
    Ole1C.EvalExpr('КаталогИБ()');

    работает
    но у меня есть IDispatch этой 1С  и так понимаю инициализация мне не нужна

    но выполнить команду ни как не получается (
  • Сергей М. © (07.11.06 08:36) [10]

    > у меня есть IDispatch этой 1С


    Откуда он у тебя взялся ?
    Показывай код ..
  • 312kbps (07.11.06 10:14) [11]
    При запуске 1С, она цепляет dll, в которую передается pConnection: IDispatch , самой 1Ски )
    Есть специальный визард для делфи, для работы с 1С.

    !?!?!?
  • guav © (07.11.06 10:22) [12]
    > [9] 312Kbps   (06.11.06 23:54)

    А так ?
    Ole1C:=pConnection
    Ole1C.EvalExpr('КаталогИБ()');

  • Сергей М. © (07.11.06 10:23) [13]
    Ну и ?

    Ты получил интерфейс, теперь ты можешь вызывать его методы.
    В чем проблема ?
  • 312kbps (07.11.06 14:27) [14]
    так тоже не работает  (((
  • Сергей М. © (07.11.06 15:01) [15]

    > так тоже не работает


    так и говорит - "не работаю" ?
  • 312kbps (07.11.06 16:28) [16]
    когда выполняю так
    Ole1C:=pConnection
    Ole1C.EvalExpr('КаталогИБ()');

    пишет что
    "Project 1cv7s.exe raised exception class EOleError with massage method 'КаталогИБ' not supported by automation object"
  • 312kbps (07.11.06 16:30) [17]
    извиняюсь

    ошибка: не обнаружен метод EvalExpr
  • Сергей М. © (07.11.06 16:53) [18]
    Справка по встроенному в 1С:ПРедприятие языку на что дана ?

    Там ведь достаточно ясно описано, методом какого конкретно класса является метод EvalExpr() ..
  • 312kbps (07.11.06 17:01) [19]
    Сергей разъесни мне пожалуйста, может я не совсем тупой )

    !?!? )
  • Сергей М. © (08.11.06 08:51) [20]
    разъеснить что ?
  • Romkin © (08.11.06 12:50) [21]
    procedure Tr1C_Link.Init1C(ver: Integer; const path: WideString);
    var
      vTmp:OleVariant;
    begin
        Close1C;
        if ver=1 then
           v1CApp:=CreateOleObject('V77.Application')
        else
           v1CApp:=CreateOleObject('V75.Application');
        vTmp:='NO_SPLASH_SHOW';
        try
           v1CApp.Initialize(v1CApp.RMTrade,path,vTmp);
        except
           v1CApp:=UnAssigned;
           raise;
        end;
    end;

    procedure Tr1C_Link.Close1C;
    begin
    //     v1CApp.ExitSystem;
        v1CApp:=UnAssigned;
        v1CDoc:=UnAssigned;
        v1CCurDoc:=UnAssigned;
        v1CForm:=UnAssigned;
    end;

    function Tr1C_Link.RetAllDocs: OleVariant;
    var
      vTmp,vTmpDoc:OleVariant;
    begin
        cdsDocs.EmptyDataSet;
        vTmp:='CreateObject(\"Документ\")';
        vTmpDoc:=v1CApp.EvalExpr(vTmp);
        vTmpDoc.SelectDocuments;
        while vTmpDoc.GetDocument>0 do
              begin
                   cdsDocs.Insert;
                   vTmp:=vTmpDoc.CurrentDocument;
                   cdsDocsN.AsInteger:=Integer(vTmp.DocNum);
                   cdsDocsDate.AsDateTime:=TDate(vTmp.DocDate);
                   cdsDocsKind.AsString:=String(vTmp.Kind);
              end;
        Result:=cdsDocs.Data;
    end;



    Древний код... Дальше сам разбирайся.
    PS. Я бы посоветовал не заморачиваться с запуском 1С (долго), а просто написать OLE object и запускать его из 1С.

    Да, пример path:
    const path='/DD:\Базы_1С\1SBDemo /M /NАдминистратор /P';
  • Zsrg (10.01.07 08:46) [22]
    Попробуй так:

    Ole1C:=pConnection;
    Ole1C := Ole1C.AppDispatch;
    Ole1C.EvalExpr('КаталогИБ()');
  • nick_van_rijn © (15.06.07 13:50) [23]
    один момент по подключению, если в строке пути к базе данных есть пробел, ну например '\Копия Db', то в 1с приходит такой путь '\Копия\' и дальше правильная строка с именем пользователя и пароля как можно это решить?
  • DrAku1a (08.12.08 07:28) [24]

    var
     Disp: IDispatch;
     OV, Ole1c: OleVariant;
    begin
    // ... как-то получаем IDispatch из DLL 1с в Disp
     OV := OleVariant(Disp);
     Ole1c := OleVariant(OV.AppDispatch);
     Ole1c.Сообщить('Превед из Delphi !!!', 'i');
    end;


    Но есть две проблемы:
    1. После этого не выгружается 1С даже при закрытии окна (что-то там глючит со счетчиками ссылок AddRef, _Release).
    2. Можно ли вытащить IDispatch без использования DLL.
    вот это не работает:

    uses SHDocVw, AddInLib, ShellAPI;

    procedure TForm1.Button1Click(Sender: TObject);
    var
     ShellWindow: IShellWindows;
     spDisp: IDispatch;
     k: integer;
     LE: IInitDone;
     OV, Ole1C: OleVariant;
    begin
     OV := Unassigned;
     Ole1c := Unassigned;
     ShellWindow := CoShellWindows.Create;
     // get the running instance of Internet Explorer
     for k := 0 to ShellWindow.Count do
     begin
       spDisp := ShellWindow.Item(k);
       if spDisp = nil then Continue;
       LE := nil;
       spDisp.QueryInterface(IInitDone, LE);
       If LE = nil then Continue;
       OV := OleVariant(spDisp);
       Ole1c := OleVariant(OV.AppDispatch);
       Ole1c.Сообщить('Привет из Delphi');
     end;
     OV := Unassigned;
     Ole1c := Unassigned;
    end;

  • Сергей М. © (08.12.08 08:59) [25]
    Причем здесь вообще какая-то там DLL ?
 
Конференция "Corba" » Idispatch OLE, вызов функций [D7, WinXP]
Есть новые Нет новых   [120359   +37][b:0][p:0.003]