![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
пара вопросов по 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 не локальной.