1.安装TortoiseSVN,本来我以为explorer要重启,右键才生效,不过explorer没有重启,右键还是出来了,不知道是怎么做的?
2.在运行某些命令比如dcc32,返回的结果和DOS下显示的结果不一致
function ExecCmd(cmd:string):string;
var
  si:TStartupInfo;
  pi:TProcessInformation;
  sa:TSecurityAttributes;
  hw,hr,dw,exitcode:Cardinal;
  Buf:array[0..1024] of Char;
  hs:THandleStream;
begin
  Result:='';
  SetLastError(0);
  cmd:=Trim(cmd);
  if IsDosCmd(BeforeA(cmd,' ')) then cmd:='cmd /c "'+cmd+'"';
  FillChar(si,SizeOf(si),0);
  FillChar(buf,SizeOf(Buf),0);
  FillChar(sa,SizeOf(sa),0);
  with sa do
  begin
    nLength:=Sizeof(sa);
    bInheritHandle:=true
  end;
  Win32Check(CreatePipe(hr,hw,@sa,0));
  Win32Check(SetHandleInformation(hr,HANDLE_FLAG_INHERIT,0));
  with si do
  begin
    dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
    wShowWindow:=SW_HIDE;
    hStdOutput:=hw;
    hStdError:=hw;
  end;
  CreateProcess(nil,PChar(cmd),nil,nil,true,CREATE_NO_WINDOW,nil,nil,si,pi);
  if GetLastError<>0 then
  begin
    Result:='运行'+cmd+'出错:'+SysErrorMessage(GetLastError);
    Exit;
  end;
  WaitForSingleObject(pi.hProcess,INFINITE);
  GetExitCodeProcess(pi.hProcess,ExitCode);
  hs:=THandleStream.Create(hr);
  if hs.Size>0 then
  begin
    with TStringList.Create do
    try
      LoadFromStream(hs);
      Result:=Text;
    finally Free end;
  end;
  hs.Free;
  CloseHandle(hr);
  CloseHandle(hw);
end;
比如运行dcc32 AdoTest.dpr
在DOS窗口下显示
ADOTEST.DPR(14)
15 lines, 0.14 seconds, 1087856 bytes code, 26697 bytes data
而此函数返回
ADOTEST.DPR(1)
ADOTEST.DPR(1)
ADOTEST.DPR(1)
ADOTEST.DPR(7)
......
15 lines, 0.14 seconds, 1087856 bytes code, 26697 bytes data
后来还观察到DOS下ADOTEST.DPR(*) *这里的数字是不断跳变的,只是很快
现在不知道怎么才能得到最终结果.当然了本人的问题远不止这两个,实在不好意思问太多.

解决方案 »

  1.   

    1、右键菜单刷新,肯定是存放在注册表中的,查一下应该有API的
    2、没用过,看了有点头晕。直接输出重定向到临时文件能不能解决问题?这样要简单些
      

  2.   

    關于第2個問題,你看一下stringlist怎么接收字串,就知道原因了...從命令行輸出的,應該包含了#10這東西,所以stringlist會只取到#10之前的字串(不止#10,還有其他的,忘記了,你自己看看..)
      

  3.   

    第一個問題,應該是操作shell api,可能是shell extension相關
      

  4.   

    tjianliang说的很对,我现在想要的就是要结果.
      

  5.   

    不好意思,第1个问题,是我弄错了,右键菜单不需要重启Explorer,只要注册就马上生效,为什么TortoiseSVN要提示重启呢,估计是还有一些其它的效果需要重启(?)
    第2个问题Avan_Lau说的太好了,跟到TStrings.LoadFromStream(Stream: TStream);
    观察S的值:mir2.dpr(1) '#$D'mir2.dpr(1),可见动画的效果是通过CR(回车)实现的.
    现修改如下:
    function cvtCR(s:string):string;
    var//todo:#$D#$A#$D
      i,j:Integer;
    begin
      Result:=s;
      i:=1;
      while i<=Length(Result) do
      begin
        if (Result[i]=#13)and(Result[i-1]<>#10)and(Result[i+1]<>#10) then
        begin
          for j:=i-1 downto 1 do if Result[j]in [#10,#13] then Break;
          if j<>0 then
          begin
            Delete(Result,j+1,i-j);
            Dec(i,i-j);
          end;
        end;
        Inc(i);
      end;
    end;
    function ExecCmd(cmd:string;psCR:Boolean=True):string;
    var
      si:TStartupInfo;
      pi:TProcessInformation;
      sa:TSecurityAttributes;
      hw,hr,dw,exitcode:Cardinal;
      Buf:array[0..1024] of Char;
    begin
      Result:='';
      SetLastError(0);
      cmd:=Trim(cmd);
      if IsDosCmd(BeforeA(cmd,' ')) then cmd:='cmd /c "'+cmd+'"';
      FillChar(si,SizeOf(si),0);
      FillChar(buf,SizeOf(Buf),0);
      FillChar(sa,SizeOf(sa),0);
      with sa do
      begin
        nLength:=Sizeof(sa);
        bInheritHandle:=true
      end;
      Win32Check(CreatePipe(hr,hw,@sa,0));
      Win32Check(SetHandleInformation(hr,HANDLE_FLAG_INHERIT,0));
      with si do
      begin
        dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow:=SW_HIDE;
        hStdOutput:=hw;
        hStdError:=hw;
      end;
      CreateProcess(nil,PChar(cmd),nil,nil,true,CREATE_NO_WINDOW,nil,nil,si,pi);
      if GetLastError<>0 then
      begin
        Result:='运行'+cmd+'出错:'+SysErrorMessage(GetLastError);
        Exit;
      end;
      WaitForSingleObject(pi.hProcess,INFINITE);
      GetExitCodeProcess(pi.hProcess,ExitCode);
      with THandleStream.Create(hr) do
      try
        if Size>0 then
        begin
          SetString(Result,nil,Size-Position);
          Read(Pointer(Result)^,Length(Result));
        end;
      finally Free end;
      CloseHandle(hr);
      CloseHandle(hw);
      if psCR then Result:=cvtCR(Result);
    end;