Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Вниз

Завершение COM сервера   Найти похожие ветки 

 
Sergic   (2002-11-29 18:55) [0]

При завершении программы, где используются СOM сервера в виде DLL, при закрытии программы происходит ошибка.
Я использую несколько DLL где распалагается COM сервер (пишутся мной же), все они реализуют один и тот же интерфейс. Все работало нормально, сделал и решил протестировать еще один. Но после его использования (т.е. использования COM сервера в программе), при закрытии приложения т.е. клиента появляется сообщение, которое сообщает, что данный сервер возможно используется другими приложениями и желаю ли я его закрыть. При ответе Да (Закрыть). Происходит исключение EPrivilege. Причем происходит внутри VCL, точнее в пакете RTL60.
Все другие COM сервера работают нормально и реализованы по одному принципу.
В чем может быть причина?


 
Sergic   (2002-11-29 19:23) [1]

Пожалуйста помогите!!!
Почему происходит данная ситуация, хотя бы ссылку или намек.


 
Набережных С.   (2002-11-29 19:45) [2]

Ссылку где-то оставил. Или с RefCount неаккуратно обошелся. Ты што, не в состоянии понять, что невидя кода ничего сказать нельзя?


 
Sergic   (2002-11-29 20:05) [3]

Ситуация такая:
в реестре прописывается CLSID и название плугина по определенному пути, программа просматривая данный раздел и создает пункты меню для каждой библиотеки

if not Assigned(RepList) then
RepList:=TInterfaceList.Create;
For I:=0 to St.Count-1 do
begin
try
//St это список строк
G:=StringToGUID(St.Strings[I]);
except
continue;
end;
//Вызываем, создаем и помещаем
try
RepInt:=CreateCOMObject(G) as IReportPlugins;
//Теперь узнаем
MI:=TMenuITem.Create(ReportItem);
RepList.Add(RepInt);
IntN:=RepList.IndexOf(RepInt);
MI.Name:="R"+IntToStr(IntN);
//Вставляем имя
MI.Caption:=Reg.ReadString(St.Strings[i]);
MI.OnClick:=ReportOnClick;
ReportItem.Add(MI);
except
Result:=False;
Continue;
end;
Result:=True;


затем когда пользователь выбириает пункт меню, то происходит вызов метода ReportOnClick



if not Assigned(RepList) then
begin
Application.MessageBox(PChar(SInterfaceListIsNull),"Модули расширений",mb_IconHand+mb_Ok);
ScanRegistry("Reports");//это метод преведенный выше
exit;
end;
For I:=0 to RepList.Count-1 do
begin
N:=(Sender as TMenuItem).Name;
Delete(N,1,1);
if StrToInt(N)=I then Break;
end;
(RepList.Items[I] as IReportPlugins).PrintExecute;


это все что отностися и где вызываются COM.


 
Набережных С.   (2002-11-29 22:41) [4]

Если RepInt - локальная, то здесь я никакого криминала не вижу. Судя по тому, что проблема появилась после добавления объекта, в этом объекте и надо искать причину. Попытайся отследить в отладчике и проанализировать вызовы AddRef и Release, сравни с объектом, с которым нет проблем. Вообще ситуация несколько странная. Ты в этом объекте не работаешь с какими-нибудь другими COM-объектами? И не использовал ли где прямое приведение интерфейсных переменных?


 
Fantasist   (2002-11-30 02:40) [5]

Если ошибка в RefCount, то можно просто попытаться насильно повызвать Release для и посмотреть, где он не обломиться.
А потоки, случаем, не используются?


 
Sergic   (2002-11-30 05:25) [6]

> Набережных С.
Вообще DLL объекте приосходит обращение к интерфейсам самой программы. Но они используются во всех и остальных DLL, и с ними проблем нет. Построены они по одному принципу. Ситуация то в том то и дело что странная. Попробую разобратся. Если разберусь сразу сообщу. Спасибо всем.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
1-28053
Сутковой Вадим
2002-11-27 16:33
2002.12.09
Раскладка клавы.


1-27924
KPV-10k
2002-11-28 22:52
2002.12.09
Создание директории...


1-27950
Vikuksa
2002-11-29 11:48
2002.12.09
AdvColumnGrid


1-28090
yuray76
2002-11-27 15:38
2002.12.09
Help


6-28159
Геннадий
2002-10-13 13:58
2002.12.09
А можно ли открыть файл с FTP как простой локальный?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский