Главная страница
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.49 MB
Время: 0.088 c
6-1155292138
Orxan
2006-08-11 14:28
2007.01.07
Как проверит существование того или иного почтового ящика,


15-1166440735
DVM
2006-12-18 14:18
2007.01.07
Напомните как вернуть QuickReport в Delphi 7.


2-1166534893
Dmytro
2006-12-19 16:28
2007.01.07
какие различия между Free и Destroy? как грамотно разрушить?


4-1156689426
FUH
2006-08-27 18:37
2007.01.07
Извлечь таблицу из MSI-инсталлятора


2-1166449505
apak
2006-12-18 16:45
2007.01.07
Синхронное листание ListBox