Форум: "Основная";
Текущий архив: 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