Форум: "Corba";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
Внизпара вопросов по COM Найти похожие ветки
← →
френк (2005-09-25 22:20) [0]Ситуация следующая: есть трехзвенка - некое ПО, 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. Как можно корректно "убить" СОМ (т.е. по сути освободить все созданные объекты)?
З.Ы. Возможно я несколько некорректен в терминологии, уж простите. И еще я понимаю что в критической секции могут быть и другие исключение нежели те, которые можно описать словами "Невозможно подключиться" =) просто такую фразу просили =) ну это я так, мало ли ) вдруг кто придерется...
← →
isasa © (2005-09-25 22:30) [1]
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 не локальной.
← →
OldNaum © (2005-09-25 22:40) [2]Щас наверное скажу глупость ) Но ведь сей код находится внутри DLL! Разве здесь глобальная переменная поможет? Я при "проектировании" первым делом про нее подумал. Но ведь... Разве данные записанные туда во время ShowProgress останутся, при условии что после ShowProgress управление вернется из DLL в MB-программу?
Простите если я сильно туплю (
← →
isasa © (2005-09-25 23:29) [3]Если 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-26 01:02) [4]Дык я про тоже =) В том то и дело, что если не выгружать. Неизвестно каким образом осуществляется работа с DLL в ГИС MapInfo по средствам скрипта. Скорее всего там динамическая загрузка.
Относительно смысла - главное было, чтобы работало ) Потому собственно и задал вопрос "как не потерять его из виду и воспользоваться в дальнейшем, при закрытии" =)
Есть ли иной выход из ситуации, окромя глобальной переменной?
З.Ы. Завтра смогу проверить что к чему, но вероятнее всего такая фишка не прокатит =(
← →
isasa © (2005-09-26 11:10) [5]> Скорее всего там динамическая загрузка.
FIntf:=CoAutoStore.Create; <- А это не загрузка?
...
FIntf:=nil; <- А это не выгрузка?
Интефейс(последний !?) закрыт - библиотека выгружена. Или я не прав?
По-крайней мере - хуже не будет.
← →
OldNaum © (2005-09-26 13:23) [6]большое спасибо, вы мне помогли ) все нормально. сделал глобальной переменной - пока полет нормальный )
isasa © (26.09.05 11:10) [5]
я несколько видать некорректно пояснил трехзвенность и где, что и как. потому и возникло недопонимание. но теперь уже все нормально, спасибо за помощь!
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.018 c