下面是intercpt.dll动态连接的源代码.(方法datain和dataout功能是拦截数据
对数据进行加密和压缩 ).生成动态连接库以后.不知道如和调用atain和dataout;
还有 DataOut(const Data: IDataBlock);参数data如何设置?
1: regsrv32 /path/intercpt.dll 可以通过在setupfactory中建立安装程序注册intercpt.dll
2: 在scktsrvr.exe中的各个端口中,那个Intercept GUID:GUID加上intercpt.dll的GUID
就是上面程序中的:
const
Class_DataCompressor: TGUID = '{B249776C-E429-11D1-AAA4-00C04FA35CFA}';
//此值可以修改,只要客户端、服务器和intercpt.dll的注册值保持一致。
3:在你的客户端中的SocketConnection的属性中intercpt的值也是这个GUID.
这就行了
scktsrvr中的TServerSocket已经对这个压缩和解压已经封装,只需要对intercpt.dll进行
注册即可。
注意第一个步骤,在客户端中也在进行注册。
在scktsrvr.exe中的扩展TServerSocket中,它是调用TSocketTransport中的FInterceptor: IDataIntercept
而这个FInterceptor是根据用户注册的IDataIntercept接口来创建的。
Datain, Dataout是集成在IDataIntercept接口中的,所以不用单独调用。
而我们所要做的是对IDataintercept接口进行接口的实现(也就是写个类来实现接口的函数
和过程),在scktsrvr中它是自动根据这个GUID调用的。
ServerSocket.InterceptGUID --> SocketTransport.InterceptGUID.
SocketTransport:
if FInterceptGUID <> '' then
Guid := StringToGuid(FInterceptGUID);
//这里将创建一个你注册了的COM对象,也就是你写的对IDataIntercept的实现类
FInterceptor := CreateComObject(Guid) as IDataIntercept;
在数据传输时,
if Assigned(FInterceptor) then
//这里就调用你写的类中的方法
FInterceptor.Datain(Data) //or FInterceptor.DataOut(Data)
下面是数据传输加密部分关键代码,把他写入intercpt.dll,重新编译
procedure Encode(SrcStream: TStream);
var
Buffer : TMemoryStream;
Ch : byte;
begin
if SrcStream.Size=0 then
exit;
// 内部创建临时的缓冲区,结果写回SrcStream, 也可以外部传入DstStream接收结果。
Buffer := TMemoryStream.Create;
try
SrcStream.Position := 0;
// 原来这里用<>判断是一个危险的方式,因为它可能会导致死循环或异常
while SrcStream.Position < SrcStream.Sizedo
begin
SrcStream.Read(Ch,1);
Ch := Ch XOR Ord('a');
Buffer.Write(ch,1);
end;
Buffer.Position := 0;
SrcStream.Size := 0;
SrcStream.CopyFrom(Buffer, 0);
finally
Buffer.Free;
end;
end;
procedure Decode(SrcStream: TStream);
var
Buffer : TMemoryStream;
Ch : byte;
begin
if SrcStream.Size=0 then
exit;
Buffer := TMemoryStream.Create;
try
SrcStream.Position := 0;
while SrcStream.Position < SrcStream.Sizedo
begin
SrcStream.Read(Ch,1);
Ch := Ch XOR Ord('a');
Buffer.Write(ch,1);
end;
Buffer.Position := 0;
SrcStream.Size := 0;
SrcStream.CopyFrom(Buffer, 0);
finally
Buffer.Free;
end;
end;