Конференция "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 - даже не нужен, вероятно.
    Это после экспериментов руками осталось
 
Конференция "Corba" » OLE сервер Outlook [D7, WinXP]
Есть новые Нет новых   [118648   +59][b:0][p:0.001]