Regsrvr32 intrcpt.dll 后为什么Intrcpt.log记录不到内容呀? ( 积分: 50 )

  • 主题发起人 主题发起人 dv11
  • 开始时间 开始时间
D

dv11

Unregistered / Unconfirmed
GUEST, unregistred user!
参考:
Client:TSocketConnection 和Server: Scktsrvr关系----压缩数据传输

时间: 2006-08-10 来自:copy_paste
一直用SocketConnection和服务端的传输数据在三层数据库中,从来没有注意到它们之间的数据传输,只是想着,管它了,网络的事,前段时间在Delphi中的Demos中发现Demos/Midas/Intrcpt.dpr例子,呵呵,再看了半天的VCL发现可以将Client端发送的给Server的数据,和Server发送给Client的数据是可以进行压缩的。呵呵,不敢藏私,Share给大家。

1:
准备工作,先delphi光盘中的/info/extras/zlib/zlib.pas进行编绎,然后copy 到lib路径中,因为要压缩数据,必须要有压缩功能,这个delphi已经自带,它是基于流的方式对接口IDataBlock(TDataBlock实现,其实就是对TMemoryStream的操作)数据进行压缩和解压的。做了这个后,才能进行下面的工作。
2:
Open /Demos/Midas/Intrcpt/Intrcpt.dpr
complier....(如没有做第一步,嘿嘿...)
生成Intrcpt.dll
将Intrcpt.dll copy to System directory,或者你的程序下面。
注册它:regsrvr32 Intrcpt.dll (为什么,这个嘛...)
记住Intrcpt.dpr的那个GUID,你也可以自己重新生成一个(按Shift+Ctrl+G)
3:
Server:
Open scktsrvr.exe,相信各位都很熟悉那界面,端口(TListbox),Thread Cache Size(TEdit), GUID(TEdit),好,我们要做的事,就是将注册的Intrcpt.dll那个GUID填到这个GUID(TEdit)框框中,
只需填自己程序的的那个端口的GUID啊,别乱填,如果有别人用这个程序,出了什么,别找我。OK,Apply.
Client:
你写的程序中肯定有TSocketConnection,它有个属性InterceptGUID: string;好了,将Intrcpt.dll的GUID填上去,它是跟Server中的一样的。OK.还有别忘了,Regsrvr32 intrcpt.dll 在你的客户端。不然,程序虽不会raise,但是Server传过来的数据是压缩的....
好了,呵呵。就这些了。3步骤,很清楚吧(不会吧,还不懂,倒)
但是Intrcpt.log记录不到内容,怎么回事情呀?
 
Regsrvr32 intrcpt.dll 只是调用了输出函数DllRegisterServer
DllRegisterServer是DELPHI在ComServ单元里实现的,没有写log文件,怎么会有内容?
 
在intrcpt单元,里面有log文件,但就是不写内容!
const
cLogFile = 'c:/Intrcpt.log';
Class_DataCompressor: TGUID = '{B249776C-E429-11D1-AAA4-00C04FA35CFA}';
implementation
uses ComServ, SysUtils, ZLib, Classes, MidConst;
{
DataIn is called whenever data is coming into the client or server. Use this
procedure to uncompress or decrypt data.
}
procedure TDataCompressor.DataIn(const Data: IDataBlock);
var
Size: Integer;
InStream, OutStream: TMemoryStream;
ZStream: TDecompressionStream;
p: Pointer;
{$ifdef LogFile}
b1: Boolean;
str: String;
iStart: DWord;
LogFile: TextFile;
{$endif}
begin
{$ifdef LogFile}
b1 := FileExists(cLogFile);
if b1 then
begin
AssignFile(LogFile, cLogFile);
Append(LogFile);
iStart := GetTickCount;
str := FormatDatetime('yyyy-mm-dd hh:nn:ss:zzz', Now)+',DataIn#,';
end;
{$endif}
InStream := TMemoryStream.Create;
try
{ Skip BytesReserved bytes of data }
p := Pointer(Integer(Data.Memory) + Data.BytesReserved);
Size := PInteger(p)^;
if Size = 0 then
Exit;
p := Pointer(Integer(p) + SizeOf(Size));
InStream.Write(p^, Data.Size - SizeOf(Size));
OutStream := TMemoryStream.Create;
try
InStream.Position := 0;
ZStream := TDecompressionStream.Create(InStream);
try
OutStream.CopyFrom(ZStream, Size);
finally
ZStream.Free;
end;
{ Clear the datablock, then
write the uncompressed data back into the
datablock }
Data.Clear;
Data.Write(OutStream.Memory^, OutStream.Size);
{$ifdef LogFile}
if b1 then
writeln(LogFile, str+IntToStr(GetTickCount-iStart)+',输入:,'+IntToStr(InStream.Size)+',输出:,'+IntToStr(OutStream.Size)+',压缩率:,'+FormatFloat('0.00%', InStream.Size/OutStream.Size*100));
{$endif}
finally
OutStream.Free;
{$ifdef LogFile}if b1 then
CloseFile(LogFile);{$endif}
end;
finally
InStream.Free;
end;
end;
 
先delphi光盘中的/info/extras/zlib/zlib.pas进行编绎?
这句怎么解释,难道单个pas可以编译?
我是把他放到Intrcpt.dpr目录
 

Similar threads

回复
0
查看
862
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部