Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Завершение COM сервера [D6, WinXP]


Sergic ©   (2002-11-29 18:55:00) 

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


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

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


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

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


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

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


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

Ситуация такая:
в реестре прописывается 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 19:45:00) [5]

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо