-
В моей проге есть компонент типа 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 нет,
а мне нужна дальнейщая работа с этим сервером.
Как быть и что неправильно?
-
ns: NameSpace;
область видимости?
-
я в своем процессе назначаю область имен
-
OLE уничтожается, когда ссылок на него становится 0
после выхода из области видимости, ссылок становится 0
какая область видимости у переменной ns: NameSpace;
var
Form1: TForm1;
ns: NameSpace; // глабальная область видимости
procedure TForm1.btn1Click(Sender: TObject);
var
ns: NameSpace; //локальная область видимости
begin
ns := OutlookApplication1.GetNamespace(WideString('MAPI'));
-
ns глобальная переменная.
У меня все мои действия с Ouylook работают нормаль,
я нахожу фолдеры, читаю контакты и пр.
Но после открытия окна ввода\корректировки контакта
и его закрытия при дальнейших обращениях пишет
"Сервер RPC недоступен" и в дияпетчере задач исчезает процесс
"Outlook.exe"
-
> после открытия окна ввода\корректировки контакта
> и его закрытия
код показывай
-
Так код показан выше
fldr:= ns.GetDefaultFolder (Outlook.OlDefaultFolders.olFolderContacts);
contitem:=fldr.Items.Item(ind) as ContactItem; //контакт с определенным индексом
contitem.Display(false);// вот открытие окна контакта Outlook
Открывается окно контакта Outlook
Произвожу изменения и закрываю с сохранением.
-
код момента
> и закрываю с сохранением.
-
Так после закрытия окна контакта Outlook
из диспетчера задач исчезает процесс "Outlook.exe"
Вот и все.
При последующих любых обращениях к серверу -
"Сервер RPC недоступен"
-
А в дальнейшем что именно нужно?
Само приложение? Или живая ссылка на contitem ?
Приложение можно вызвать повторно.
-
т.е. ты его вызываешь, работаешь, и закрываешь потом, руками?
(т.е. не через интерфейсы, не программно ?)
-
сервер загружается в проге
ns:= fm1.OutlookApplication1.GetNamespace(WideString('MAPI'));
затем я из своей проге строю дерево папок(фолдеров) контактов
Outlook и могу просматривать содержимое в своем окне
(данные разных контактов)
Есть желание корректировать данные выбранного контакта.
Вот я и вызываю окно контакта Outlook и в нем произвожу
изменения и закрываю с сохранением это окно(руками)
при этом из диспетчера задач исчезает процесс "Outlook.exe"
А мне надо продолжить работу с папками и просматривать контакты.
Надо чтобы не выгружался процесс "Outlook.exe"
-
ну дык ты же прибил его..
закрываю с сохранением это окно
а надо дальше тоже делать программно
(
т.е. через автоматизацию
(понятно, что сам аутглюк тоже не ломом и не из папье-маше меняет :))
)
ну, т.е. аля
contitem.FirstName := 'qwer';
contitem.Email1Address := 'qwer@wer.qw'
и т.п.
или заново родить его
-
ну дык ты же прибил его..
Ну а как не прибить, а только уменьшить счетчик ссылок?
ну, т.е. аля
contitem.FirstName := 'qwer';
contitem.Email1Address := 'qwer@wer.qw'
и т.п.
Но меня не интересует контакт.
Это одно из самых неглавных задач
А заново создать ссылку на ns не получается
делаю снова
ns:= fm1.OutlookApplication1.GetNamespace(WideString('MAPI'));
и ничего.
-
да, что-то не получается..
как вариант - запускать Outlook раньше,
а OutlookApplication1 пусть будет с
ConnectKind = ckRunningInstance
Если не хозяева, то и процесс не прибивается
-
Спасибо, попробую.
-
попробовал,
не закрывается Outlook.
Если кто еще что-то скажет - хорошо :).
А пока не сказал, возможно, просто запустить через CreateProcess, потом соединятся как ckRunningInstance?
-
Спасибо, но у меня ругался на ckRunningInstance
"Unable to retrieve a pointer to a running object re gistered
with OLE for Outlook.Application.14 {000............}"
И при этом ведь должно быть у OutlookApplication1 AutoConnect=true ?
Если можно, дайте весь код пожалуста.
-
да вот и весь код...
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;
-
да, модули..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleServer, OutlookXP, StdCtrls, ComObj;
ComObj - даже не нужен, вероятно.
Это после экспериментов руками осталось
-
Спасибо, но если запущен Outlook , то и не надо ни каких
ухищрений и так все работает и при ckRunningOrNew.
А ConnectKind = ckRunningInstance при AutoConnect = False
не имеет смысла
Вобщем это плохое решение, так как надо самому запускать
Outlook и объяснять это пользователю.(?????)
Надо чтобы работало только из проги через OLE сервер.
-
А я вот вообще не использую компоненты вроде TOutlookApplication. Вместо этого делаю как-то так:
try
Outlook := GetActiveOleObject('Outlook.Application') ;
except
Outlook := CreateOleObject('Outlook.Application') ;
end;
Если Outlook стартован, будет получена ссылка на него. Если нет - он будет стартован и будет получена ссылка на него.
-
Спасибо.
И что при этом не будет того эффекта
( то есть выгрузка процесса после
закрытия окна Outlook "Контакты"?
Почитайте историю писем.
-
Я читал переписку. Я не знаю. Просто у меня возникло предположение, что компонент TOutlookApplication всегда создает новый экземпляр сервера аутлук, если использовать свойство AutoConnect := True.
К сожалению, у меня нет исхзодных текстов этого компонента, чтобы залезть и посмотреть, как там все организовано.
Но я вот что думаю. Так как в списке методов я вижу метод ConnectTo(), следовательно, должна существовать возможность подключиться к уже имеющемуся экземпляру сервера автоматизации. Нужно, ИМХО, выяснить, зачем этот метод и как его задействовать.
-
Спасибо.
экземпляр сервера аутлук создается в моей проге один раз при запуске
и я с ним работаю до выхода из программы.
ns := OutlookApplication1.GetNamespace(WideString('MAPI'));
где ns: NameSpace; // глабальная область видимости
Но если я запускаю от себя окно Контакта Outlook
посредством функции contitem.Display(false) и
потом его закрываю, то процесс "Outlook.exe"
выгружается, а мне надо продолжать работу
с сервером.