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

Вниз

inproc com-server   Найти похожие ветки 

 
kblc ©   (2005-09-07 21:14) [0]

Уважаемые мастера, помогите пожалуйста решить проблему.

У меня есть фабрика классов, с помошью котороя я создаю единственную копию COM-сервера (inproc).

т.е. у меня есть COM-сервер (TVARSERVER)


 IServer = interface
   function ExecFunc(const Parameters: Widestring; var sResult: Widestring): HRESULT; stdcall;
   ...
 end;

 TIServer = class(TComObject, IServer)
   ...
 protected
   function ExecFunc(const Parameters: Widestring; var sResult: Widestring): HRESULT; virtual; stdcall;
   ...
 end;

 TVARServer = class(TIServer)
   ...
 protected
   function ExecFunc(const Parameters: Widestring; var sResult: Widestring): HRESULT; override;
   ...
 end;

function TVARServer.GetVariable(const sGroup, sName: string; var sResult: WideString): boolean;
var
 NewLng, n: Integer;
 Buff: array[0..65535] of byte;
 TmpStr: string;
begin
 Result:=FALSE;
 if Assigned(Reg) then
 try
   if Reg.OpenKey(prRegistryKey+"\"+sGroup,FALSE) then
   if Reg.ValueExists(sName) then
   begin
     case Reg.GetDataType(sName) of
       rdBinary:
       begin
         NewLng:=Reg.ReadBinaryData(sName,Buff,High(Buff));
         TmpStr:="";
         if NewLng>0 then
         begin
            for n:=0 to NewLng-1 do TmpStr:=TmpStr+char(Buff[n]);
            sResult:=DeCrypt(TmpStr);
         end;
       end;
       rdString:
       begin
         sResult:=Reg.ReadString(sName);
       end;
     end;
     Result:=TRUE;
     Reg.CloseKey;
   end else
     prLastError:=".";
 except
   on E: Exception do
   prLastError:=".."+E.Message;
 end else
   prLastError:="...";
end;

Reg: TResistry;
// инициализируется при procedure Initialize; override;

В функции ExecFunc() при некоторых условиях выполняется GetVariable();
Когда к нему обращаются COM-сервера унаследованные от TIServer, то всё рпоходит хорошо, а если к нему обратился какой-либо другой сервер, то на команде Reg.OpenKey(); вываливается исключение (Access Violation at address * in Module varserver.dll; Write at address *)

С чем это может быть связано?


 
kblc ©   (2005-09-07 22:07) [1]

Я был немного не прав.

 Сейчас передел все сервера, унаследовал их от одного, создаю одной фабрикой - и всё равно: итог тот же самый.
 Все сервера запускаются внутри одного процесса (клиента).

 Помогите пожалуйста!


 
Попов Виталий   (2005-09-08 15:06) [2]

Попробуй объявить Reg в процедуре GetVariable, в ней же создавай и уничтожай (Reg.Free).


 
Erik1 ©   (2005-09-15 15:38) [3]

А можеш вобще выкинуть TResistry и работать API функциями.



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

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
15-1163699126
furyz
2006-11-16 20:45
2006.12.10
WineHQ + FreeBSD


2-1163774326
312kbps
2006-11-17 17:38
2006.12.10
Опрос конкретного порта во всей локальной сети !


2-1164018221
werb
2006-11-20 13:23
2006.12.10
Win32 console и сообщения


1-1161948280
alucard
2006-10-27 15:24
2006.12.10
Подскажите как сделать прогу чтоб подменяла нажатие клавиш


15-1163983409
Ру
2006-11-20 03:43
2006.12.10
Он-лайн переводчики сайтов. С русского на инглиш Подскажите?