📄 publicfunctionunit.pas
字号:
begin
if op^.ptrBuffer <> nil then
Dispose(op^.ptrBuffer);
Dispose(op);
op := nil;
end;
end;
//重置单I/O数据内存
procedure InitIoContext(ovlap_prt : PPerHandleData; const BufLen : integer = MAX_BUFSIZE);
begin
//重置重叠结构
ZeroMemory(@ovlap_prt^.Overlapped, sizeof(OVERLAPPED));
//清空数据缓冲区
FillChar(ovlap_prt^.Buffer, MAX_BUFSIZE, 0);
ovlap_prt^.ptrBuffer^.buf := @ovlap_prt^.Buffer[0];
ovlap_prt^.ptrBuffer^.len := BufLen;
end;
//发送命令
procedure SetCmdSignByte(OperatingSocket : TSocket; CMDHeader : TInterChangeHeader;
const IsScreenOrder : Boolean = True; const FileName : string = '');
var
CmdPerHandleData : PPerHandleData;
CMDDataHeaderInfo : TDataHeaderInfo;
dwBytes, dwFlags: DWORD;
nRet : integer;
//向远程主机发送屏传命令的数组
CmdSignByteArray : array[0..1] of Byte;
begin
if OperatingSocket <> 0 then
begin
MakeOverlappedPlus(CmdPerHandleData, IO_WRITE);
CmdPerHandleData^.Socket := OperatingSocket;
InitIoContext(CmdPerHandleData);
//设置发送类型是控制信息
CmdPerHandleData^.sendCMDtype := CMD_SENDCTRL;
//初始统计数据量
CMDDataHeaderInfo.UnCompressedDataSize := 0;
CMDDataHeaderInfo.CompressedDataSize := sizeof(CmdSignByteArray);
CmdPerHandleData^.ptrBuffer^.len := Sizeof(CMDDataHeaderInfo) + CMDDataHeaderInfo.CompressedDataSize;
if IsScreenOrder then
begin
case CMDHeader.Order of
SetPixel1,
SetPixel4,
SetPixel8,
SetPixel16,
SetPixel24:
//如果是设置色深的,则第一个字节就是0
CmdSignByteArray[0] := 0;
GetSinglePic:
//如果是单张传输的,则第一个字节就是2
CmdSignByteArray[0] := 2;
end;
CmdSignByteArray[1] := Byte(CMDHeader.Order);
//将屏传色深或者单张截取控制命令写入buffer
CopyMemory(@CmdPerHandleData^.Buffer[Sizeof(CMDDataHeaderInfo)],
@CmdSignByteArray[0], sizeof(CmdSignByteArray));
end
else
begin
//写入命令头字节
CopyMemory(@CmdPerHandleData^.Buffer[sizeof(CMDDataHeaderInfo)], @CMDHeader, sizeof(CMDHeader));
//写入新的文件夹字符串
CopyMemory(@CmdPerHandleData^.Buffer[sizeof(CMDDataHeaderInfo) + Sizeof(CMDHeader)],
PChar(FileName), Length(FileName));
//统计数据量
CMDDataHeaderInfo.CompressedDataSize := sizeof(CMDHeader) + Length(FileName);
CmdPerHandleData^.ptrBuffer^.len := Sizeof(CMDDataHeaderInfo) + CMDDataHeaderInfo.CompressedDataSize;
end;
//写入数据发送区
CopyMemory(@CmdPerHandleData^.Buffer[0], @CMDDataHeaderInfo, Sizeof(CMDDataHeaderInfo));
//申请数据发送
ZeroMemory(@CmdPerHandleData^.Overlapped, sizeof(OVERLAPPED));
dwFlags := 0;
nRet := WSASend(CmdPerHandleData^.Socket, @CmdPerHandleData^.ptrBuffer^, 1,
dwBytes, dwFlags, @CmdPerHandleData^.Overlapped, nil);
if((nRet = SOCKET_ERROR) and (WSAGetLastError() <> WSA_IO_PENDING)) then
begin
closesocket(CmdPerHandleData^.Socket);
exit;
end;
end;
end;
//发送鼠标和键盘控制
procedure SetCtrlStructure(OperatingSocket: TSocket;
KeyAndCursorData : TKeyAndCursorData; var CtrlPerHandleData : PPerHandleData);
var
CtrlDataHeaderInfo : TDataHeaderInfo;
dwBytes, dwFlags: DWORD;
nRet : integer;
begin
if OperatingSocket <> 0 then
begin
CtrlPerHandleData^.Socket := OperatingSocket;
InitIoContext(CtrlPerHandleData, Sizeof(CtrlDataHeaderInfo) + 1 + sizeof(KeyAndCursorData));
//设置发送类型是控制信息
CtrlPerHandleData^.sendCMDtype := CMD_SENDMOUSE_KEY_CTRL;
//发送控制命令
CtrlDataHeaderInfo.UnCompressedDataSize := 0;
CtrlDataHeaderInfo.CompressedDataSize := 1 + sizeof(KeyAndCursorData);
CopyMemory(@CtrlPerHandleData^.Buffer[0], @CtrlDataHeaderInfo, Sizeof(CtrlDataHeaderInfo));
//设置接收标志是1,告诉client是鼠标和键盘控制的数据
CtrlPerHandleData^.Buffer[Sizeof(CtrlDataHeaderInfo)] := Char(1);
CopyMemory(@CtrlPerHandleData^.Buffer[0 + 1 + Sizeof(CtrlDataHeaderInfo)],
@KeyAndCursorData, sizeof(KeyAndCursorData));
//申请数据发送
ZeroMemory(@CtrlPerHandleData^.Overlapped, sizeof(OVERLAPPED));
dwFlags := 0;
nRet := WSASend(CtrlPerHandleData^.Socket, @CtrlPerHandleData^.ptrBuffer^, 1,
dwBytes, dwFlags, @CtrlPerHandleData^.Overlapped, nil);
if( ( nRet = SOCKET_ERROR ) and ( WSAGetLastError() <> WSA_IO_PENDING ) ) then
begin
closesocket(CtrlPerHandleData^.Socket);
exit;
end;
end;
end;
//简单的内存池实现--获取内存
procedure GetMyMem(const Size : DWORD; var P : Pointer; const Pool : array of Char);begin if Size <= DWORD(sizeof(Pool)) then begin
ZeroMemory(@Pool[0], sizeof(Pool));
P := @Pool[0];
end
else
P := AllocMem(Size);
end;//简单的内存池实现--释放内存procedure FreeMyMem(var P : Pointer; const Pool : array of Char);
begin
if DWORD(P) <> DWORD(@Pool[0]) then
begin
if P <> nil then
FreeMem(P);
P := nil;
end;
end;
//得到主机位置
function GetRemoteAddress(const IP : string) : string;
var
slIPData: TStringlist;
IPRecordID: int64;
QQWry: TQQWry;
begin
//IP地址->地址信息
try
if not FileExists('QQWry.Dat') then
begin
Result := '';
exit;
end;
QQWry := TQQWry.Create('QQWry.Dat');
IPRecordID := QQWry.GetIPDataID(IP);
slIPData := TStringlist.Create;
QQWry.GetIPDataByIPRecordID(IPRecordID, slIPData);
QQWry.Destroy;
Result := format('%s : %s', [slIPData[2], slIPData[3]]);
slIPData.Free;
except
Result := '';
end;
end;
//将类函数实例化
function MakeProcInstance(M: TMethod): Pointer;
begin
// allocate memory
GetMem(Result, 15);
asm
// MOV ECX,
MOV BYTE PTR [EAX], $B9
MOV ECX, M.Data
MOV DWORD PTR [EAX+$1], ECX
// POP EDX
MOV BYTE PTR [EAX+$5], $5A
// PUSH ECX
MOV BYTE PTR [EAX+$6], $51
// PUSH EDX
MOV BYTE PTR [EAX+$7], $52
// MOV ECX,
MOV BYTE PTR [EAX+$8], $B9
MOV ECX, M.Code
MOV DWORD PTR [EAX+$9], ECX
// JMP ECX
MOV BYTE PTR [EAX+$D], $FF
MOV BYTE PTR [EAX+$E], $E1
end;
end;
//释放掉实例化占用的内存
procedure FreeProcInstance(ProcInstance: Pointer);
begin
// free memory
FreeMem(ProcInstance, 15);
end;
//将文件时间格式转化为日期时间格式
Function FileTimeToDateTime(FileTime : TFileTime) : TDateTime;
var
LocalTime : TFileTime;
SystemTime : TSystemTime;
begin
Result := EncodeDate(1900, 1, 1);
if FileTimeToLocalFileTime(FileTime, LocalTime) then
if FileTimeToSystemTime(LocalTime, SystemTime) then
Result := SystemTimeToDateTime(SystemTime);
end;
//得到文件的大小
function GetFileSize(const FileName : string) : LongInt;
var
SearchRec : TSearchRec;
begin
try
if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
Result := SearchRec.Size
else Result := -1;
finally
SysUtils.FindClose(SearchRec);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -