Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.011 c
15-1166413037
Думкин
2006-12-18 06:37
2007.01.07
Якутский город Алдан должен стать восточной столицей России


6-1155398565
SamProf
2006-08-12 20:02
2007.01.07
Connection reset by peer


2-1166293515
Галинка
2006-12-16 21:25
2007.01.07
DecimalSeparator &amp; c#


15-1166178154
031178
2006-12-15 13:22
2007.01.07
К кого есть компоненты Alvas Components Collection for delphi 7 ?


15-1166412168
Slider007
2006-12-18 06:22
2007.01.07
С днем рождения ! 18 декабря





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский