Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

пара вопросов по COM [Delphi, Windows]


френк ©   (2005-09-25 22:20:00) 

Ситуация следующая: есть трехзвенка - некое ПО, dll-обертка к функциям СОМа (ПО не может работать с СОМом (по ряду причин) на прямую) и сам СОМ-сервер. Сервер автоматизации внешний (dll), Multiple Instance / Apartment.

Сервер автоматизации предоставляет некоему ПО (небольшая прикладная программа написанная на скрипте MapBasic под MapInfo) несколько функций, среди которых есть отображение диалогового окна прогресса (ну все как обычно: прогресс, лог операций и прочее =)

Ниже описана функция-обертка в DLL, которую вызывает MapBasic-программа с целью отобразить диалог:

function ShowProgress(Caption,Info,Text: PChar; MaxPos,CurPos: Integer; Addon,Memo: PChar): Integer; cdecl;
var
FIntf: IAutoStore;
begin
Result:=0;
try
 FIntf:=CoAutoStore.Create;
 FIntf.coreShowProgress(Caption,Info,Text,MaxPos,CurPos,Addon,Memo);
except
 MessageBox(0,'Не удалось подсоединиться к серверу!',
            'D2MB Library',MB_OK);
end;
end;


Понятное дело, что я не освобождаю объект, дабы форма показалась и работала, не смотря на выход из функции, что необходимо для дальнейшей работы MB-программы.

Проблема возникает при закрытии формы )

function CloseProgress: Integer; cdecl;
var
FIntf: IAutoStore;
begin
Result:=0;
try
 FIntf:=CoAutoStore.Create;
 FIntf.coreCloseProgress;
except
 MessageBox(0,'Не удалось подсоединиться к серверу!',
            'D2MB Library',MB_OK);
end;
FIntf:=nil;
end;


Приходится создавать новый объект, за вместо "подключения" к экземпляру ранее созданного (см. ShowProgress). В результате где-то, судя по всему происходит глюк (вылетает сама MapInfo).

1. Как бы корректно енто все дело завершить? Т.е. в CloseProgress все-таки освободить тот объект, который был ранее создан, за вместо создания нового )

2. Как можно корректно "убить" СОМ (т.е. по сути освободить все созданные объекты)?

З.Ы. Возможно я несколько некорректен в терминологии, уж простите. И еще я понимаю что в критической секции могут быть и другие исключение нежели те, которые можно описать словами "Невозможно подключиться" =) просто такую фразу просили =) ну это я так, мало ли ) вдруг кто придерется...


OldNaum   (2005-09-26 13:23:00) [1]

большое спасибо, вы мне помогли ) все нормально. сделал глобальной переменной - пока полет нормальный )

isasa ©   (26.09.05 11:10) [5]
я несколько видать некорректно пояснил трехзвенность и где, что и как. потому и возникло недопонимание. но теперь уже все нормально, спасибо за помощь!


isasa   (2005-09-26 11:10:00) [2]

> Скорее всего там динамическая загрузка.

FIntf:=CoAutoStore.Create;  <- А это не загрузка?
...
FIntf:=nil; <- А это не выгрузка?

Интефейс(последний !?) закрыт - библиотека выгружена. Или я не прав?
По-крайней мере - хуже не будет.


OldNaum   (2005-09-26 01:02:00) [3]

Дык я про тоже =) В том то и дело, что если не выгружать. Неизвестно каким образом осуществляется работа с DLL в ГИС MapInfo по средствам скрипта. Скорее всего там динамическая загрузка.

Относительно смысла - главное было, чтобы работало ) Потому собственно и задал вопрос "как не потерять его из виду и воспользоваться в дальнейшем, при закрытии" =)

Есть ли иной выход из ситуации, окромя глобальной переменной?

З.Ы. Завтра смогу проверить что к чему, но вероятнее всего такая фишка не прокатит =(


isasa   (2005-09-25 23:29:00) [4]

Если DLL не выгружать - останется.
Смысл?

function ShowProgress(Caption,Info,Text: PChar; MaxPos,CurPos: Integer; Addon,Memo: PChar): Integer; cdecl;
var
FIntf: IAutoStore;   <<<<<<------------ Смысл?
begin
...
FIntf:=CoAutoStore.Create;
...
end;


Создаем указатель, и тут-же теряем его.


OldNaum   (2005-09-25 22:40:00) [5]

Щас наверное скажу глупость ) Но ведь сей код находится внутри DLL! Разве здесь глобальная переменная поможет? Я при "проектировании" первым делом про нее подумал. Но ведь... Разве данные записанные туда во время ShowProgress останутся, при условии что после ShowProgress управление вернется из DLL в MB-программу?

Простите если я сильно туплю (


isasa   (2005-09-25 22:30:00) [6]


var
FIntf: IAutoStore;

function ShowProgress(Caption,Info,Text: PChar; MaxPos,CurPos: Integer; Addon,Memo: PChar): Integer; cdecl;
begin
...
end;
...............
function CloseProgress: Integer; cdecl;
begin
...
 FIntf:=nil;
end;

Сделать переменную FIntf не локальной.


Наверх

Титульная страница Поиск, карта сайта Написать письмо