![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
inproc com-server [Win95/98, WinME, Win2k, WinXP]
kblc © (2005-09-07 21:14:00)Уважаемые мастера, помогите пожалуйста решить проблему.
У меня есть фабрика классов, с помошью котороя я создаю единственную копию 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 *)
С чем это может быть связано?
Erik1 (2005-09-15 15:38:00) [1]А можеш вобще выкинуть TResistry и работать API функциями.
Попов Виталий (2005-09-08 15:06:00) [2]Попробуй объявить Reg в процедуре GetVariable, в ней же создавай и уничтожай (Reg.Free).
kblc (2005-09-07 22:07:00) [3]Я был немного не прав.
Сейчас передел все сервера, унаследовал их от одного, создаю одной фабрикой - и всё равно: итог тот же самый.
Все сервера запускаются внутри одного процесса (клиента).
Помогите пожалуйста!