Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

пара вопросов по 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 вся ветка

Текущий архив: 2007.01.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.09 c
15-1166520001
tesseract
2006-12-19 12:20
2007.01.07
к 100-летию Леонида Ильича от керка


15-1166347457
Alex_ey
2006-12-17 12:24
2007.01.07
outlook


15-1166191062
zdm
2006-12-15 16:57
2007.01.07
AMD vs Intel


15-1165865326
Святослав
2006-12-11 22:28
2007.01.07
UML 2.0 в Delphi 2006


15-1166434770
ArtemESC
2006-12-18 12:39
2007.01.07
Почему не происходит чтение следующего кода???