![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение 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]Пожалуйста помогите!!!
Почему происходит данная ситуация, хотя бы ссылку или намек.