Конференция "Corba" » OLE сервер Outlook [D7, WinXP]
 
  • Alekss1944 © (13.11.12 12:36) [0]
    В моей проге есть компонент типа TOutlookApplication
    делаю так
    ns: NameSpace;
    ns:= fm1.OutlookApplication1.GetNamespace(WideString('MAPI'));
    то есть запускаю сервер
    в диспетчере задач вижу запуск процесса Outlook.exe
    .........................
    далее вызываю окно конакта для изменения

    fldr:= ns.GetDefaultFolder (Outlook.OlDefaultFolders.olFolderContacts);
    contitem:=fldr.Items.Item(ind) as ContactItem; //контакт с определенным индексом
    contitem.Display(false);

    Открывается окно контакта Outlook
    Произвожу изменения и закрываю с сохранением.

    При этом вижу в диспеичере задач что процесса Outlook.exe нет,
    а мне нужна дальнейщая работа с этим сервером.
    Как быть и что неправильно?
  • AV © (13.11.12 12:48) [1]
    ns: NameSpace;
    область видимости?
  • Alekss1944 © (13.11.12 14:40) [2]
    я в своем процессе назначаю область имен
  • AV © (13.11.12 15:10) [3]
    OLE уничтожается, когда ссылок на него становится 0
    после выхода из области видимости, ссылок становится 0
    какая область видимости у переменной ns: NameSpace;

    var
     Form1: TForm1;
     ns: NameSpace; // глабальная область видимости

    procedure TForm1.btn1Click(Sender: TObject);
    var
     ns: NameSpace; //локальная область видимости
    begin
    ns := OutlookApplication1.GetNamespace(WideString('MAPI'));
  • Alekss1944 © (13.11.12 18:04) [4]
    ns глобальная переменная.
    У меня все мои действия с Ouylook работают нормаль,
    я нахожу фолдеры, читаю контакты и пр.
    Но после открытия окна ввода\корректировки контакта
    и его закрытия при дальнейших обращениях пишет
    "Сервер RPC недоступен" и в дияпетчере задач исчезает процесс
    "Outlook.exe"
  • AV © (13.11.12 19:15) [5]

    > после открытия окна ввода\корректировки контакта
    > и его закрытия

    код показывай
  • Alekss1944 © (14.11.12 11:01) [6]
    Так код показан выше

    fldr:= ns.GetDefaultFolder (Outlook.OlDefaultFolders.olFolderContacts);
    contitem:=fldr.Items.Item(ind) as ContactItem; //контакт с определенным индексом
    contitem.Display(false);// вот открытие окна контакта Outlook

    Открывается окно контакта Outlook
    Произвожу изменения и закрываю с сохранением.
  • AV © (14.11.12 12:36) [7]
    код момента

    > и закрываю с сохранением.
  • Alekss1944 © (14.11.12 18:39) [8]
    Так после закрытия окна контакта Outlook
    из диспетчера задач исчезает процесс "Outlook.exe"
    Вот и все.
    При последующих любых обращениях к серверу -  
    "Сервер RPC недоступен"
  • Аббат Пиккола (14.11.12 19:41) [9]
    А в дальнейшем что именно нужно?
    Само приложение? Или живая ссылка на contitem ?
    Приложение можно вызвать повторно.
  • AV © (14.11.12 22:01) [10]
    т.е. ты его вызываешь, работаешь, и закрываешь потом, руками?
    (т.е. не через интерфейсы, не программно ?)
  • Alekss1944 © (15.11.12 11:05) [11]
    сервер загружается в проге
    ns:= fm1.OutlookApplication1.GetNamespace(WideString('MAPI'));
    затем я из своей проге строю дерево папок(фолдеров) контактов
    Outlook и могу просматривать содержимое в своем окне
    (данные разных контактов)
    Есть желание корректировать данные выбранного контакта.
    Вот я и вызываю окно контакта Outlook и в нем произвожу
    изменения и закрываю с сохранением это окно(руками)
    при этом из диспетчера задач исчезает процесс "Outlook.exe"
    А мне надо продолжить работу с папками и просматривать контакты.
    Надо чтобы не выгружался процесс  "Outlook.exe"
  • AV © (15.11.12 12:48) [12]
    ну дык ты же прибил его..

    закрываю с сохранением это окно


    а надо дальше тоже делать программно
    (
    т.е. через автоматизацию
    (понятно, что сам аутглюк тоже не ломом и не из папье-маше меняет :))
    )

    ну, т.е. аля
    contitem.FirstName :=  'qwer';
    contitem.Email1Address := 'qwer@wer.qw'
    и т.п.

    или заново родить его
  • Alekss1944 © (15.11.12 13:36) [13]
    ну дык ты же прибил его..
    Ну а как не прибить, а только уменьшить счетчик ссылок?

    ну, т.е. аля
    contitem.FirstName :=  'qwer';
    contitem.Email1Address := 'qwer@wer.qw'
    и т.п.
    Но меня не интересует контакт.
    Это одно из самых неглавных задач
    А заново создать ссылку на ns не получается
    делаю снова
    ns:= fm1.OutlookApplication1.GetNamespace(WideString('MAPI'));
    и ничего.
  • AV © (15.11.12 14:35) [14]
    да, что-то не получается..

    как вариант - запускать Outlook раньше,
    а OutlookApplication1 пусть будет с
       ConnectKind = ckRunningInstance

    Если не хозяева, то и процесс не прибивается
  • Alekss1944 © (15.11.12 17:51) [15]
    Спасибо, попробую.
  • AV © (16.11.12 17:08) [16]
    попробовал,
    не закрывается Outlook.

    Если кто еще что-то скажет - хорошо :).
    А пока не сказал, возможно, просто запустить через CreateProcess, потом соединятся как ckRunningInstance?
  • Alekss1944 © (19.11.12 16:04) [17]
    Спасибо, но у меня ругался на ckRunningInstance
    "Unable to retrieve a pointer to a running object re gistered
    with OLE for Outlook.Application.14 {000............}"

    И при этом ведь должно быть у OutlookApplication1 AutoConnect=true ?
    Если можно, дайте весь код пожалуста.
  • AV © (19.11.12 17:37) [18]
    да вот и весь код...

     object OutlookApplication1: TOutlookApplication
       AutoConnect = False
       ConnectKind = ckRunningInstance
       AutoQuit = False

    type
     TForm1 = class(TForm)
       btn1: TButton;
       OutlookApplication1: TOutlookApplication;
       procedure btn1Click(Sender: TObject);
     private    { Private declarations }
     public     { Public declarations }

       ns: NameSpace;
       fldr: MAPIFolder;
       contitem: ContactItem;

     end;

    var
     Form1: TForm1;

    implementation
    {$R *.dfm}

    procedure TForm1.btn1Click(Sender: TObject);  
    // Outlook к этому времени запущен даблКликом по иконке на раб столе
    begin
     ns := OutlookApplication1.GetNamespace(WideString('MAPI'));
     fldr := ns.GetDefaultFolder(olFolderContacts);
     contitem := (fldr.Items.Item(1) as ContactItem);
     contitem.Display(false);
    // закрытие без прерывание процесса Outlook
    end;
  • AV © (19.11.12 17:39) [19]
    да, модули..

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, OleServer, OutlookXP, StdCtrls, ComObj;

    ComObj - даже не нужен, вероятно.
    Это после экспериментов руками осталось
  • Alekss1944 © (20.11.12 12:00) [20]
    Спасибо, но если запущен  Outlook , то и не надо ни каких
    ухищрений и так все работает и при ckRunningOrNew.
    А   ConnectKind = ckRunningInstance при AutoConnect = False
    не имеет смысла
     
    Вобщем это плохое решение, так как надо самому запускать
    Outlook и объяснять это пользователю.(?????)
    Надо чтобы работало только из проги через OLE сервер.
  • Аббат Пиккола (28.11.12 12:15) [21]
    А я вот вообще не использую компоненты вроде TOutlookApplication. Вместо этого делаю как-то так:

    try
     Outlook := GetActiveOleObject('Outlook.Application') ;
    except
     Outlook := CreateOleObject('Outlook.Application') ;
    end;

    Если Outlook стартован, будет получена ссылка на него. Если нет - он будет стартован и будет получена ссылка на него.
  • Alekss1944 © (28.11.12 15:52) [22]
    Спасибо.
    И что при этом не будет того эффекта
    ( то есть выгрузка процесса после
    закрытия окна Outlook "Контакты"?
    Почитайте историю писем.
  • Аббат Пиккола (28.11.12 18:00) [23]
    Я читал переписку. Я не знаю. Просто у меня возникло предположение, что компонент TOutlookApplication всегда создает новый экземпляр сервера аутлук, если использовать свойство AutoConnect := True.
    К сожалению, у меня нет исхзодных текстов этого компонента, чтобы залезть и посмотреть, как там все организовано.
    Но я вот что думаю. Так как в списке методов я вижу метод ConnectTo(), следовательно, должна существовать возможность подключиться к уже имеющемуся экземпляру сервера автоматизации. Нужно, ИМХО, выяснить, зачем этот метод и как его задействовать.
  • Alekss1944 © (28.11.12 18:24) [24]
    Спасибо.
    экземпляр сервера аутлук создается в моей проге один раз при запуске
    и я с ним работаю до выхода из программы.
    ns := OutlookApplication1.GetNamespace(WideString('MAPI'));
    где  ns: NameSpace; // глабальная область видимости

    Но если я запускаю от себя окно Контакта Outlook
    посредством функции  contitem.Display(false) и
    потом его закрываю, то процесс   "Outlook.exe"
    выгружается, а мне надо продолжать работу
    с сервером.
 
Конференция "Corba" » OLE сервер Outlook [D7, WinXP]
Есть новые Нет новых   [118662   +27][b:0][p:0.001]