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(*) *这里的数字是不断跳变的,只是很快
现在不知道怎么才能得到最终结果.当然了本人的问题远不止这两个,实在不好意思问太多.
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(*) *这里的数字是不断跳变的,只是很快
现在不知道怎么才能得到最终结果.当然了本人的问题远不止这两个,实在不好意思问太多.
解决方案 »
- 功能请教
- 我读出文件为什么跟别人读的文件内容不一样,帮我看看这个困扰我多时的问题!
- 语句之间的区别:
- 我想做个检测 对方qq是否登陆的软件(对方阴身时)
- 請"救"!Delphi 7 的idSMTP 和 idPOP3 組件的用法?
- 请问到哪能下载到MSCOMM控件。
- 初学delphi者问题:[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
- FastReport怎么将没有记录的地方也画上格子???
- 如果何通过程序取得主板的序列号
- 编译错误
- 线程中时间控件sleep
- delphi使用fastreport如何打印指定的一条记录
2、没用过,看了有点头晕。直接输出重定向到临时文件能不能解决问题?这样要简单些
第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;