Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

OLE сервер Outlook [D7, WinXP]


Alekss1944 ©   (13.11.12 12:36

В моей проге есть компонент типа 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"
выгружается, а мне надо продолжать работу
с сервером.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо