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

Вниз

Завершение 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
14-28231
copyr25
2002-11-16 14:59
2002.12.09
В Исландию! Поздравьте меня!


1-28038
Maxval
2002-11-30 11:21
2002.12.09
Как правильно вывести дату?


4-28372
serd_hhc
2002-10-26 04:36
2002.12.09
Как узнать хэндл...


8-28148
Fredericco
2002-07-05 16:31
2002.12.09
Вопрос по захвату потокового видео.


14-28199
iNew
2002-11-20 05:05
2002.12.09
Почему не доходит сообщение посланное командой net send