这种问题如何解决(我本人看来有点难)?(200分)

  • 主题发起人 主题发起人 wghmy
  • 开始时间 开始时间
W

wghmy

Unregistered / Unconfirmed
GUEST, unregistred user!
我现正在做一个远程传输的模块,用的SQL BCP工具。
如下所示:
Winexec(PChar('bcp '+DataBaseName+'..TR_'+ExTbnm+' out '+TempPath+ExTbnm+'.dat -c -S '+ServerName+' -U '+UserName+' -P '+Password),SW_HIDE);
if not FileExists(TempPath+ExTbnm+'.dat') then
begin
MessageBox(Application.Handle,'导出文件出错!','错误',MB_ICONERROR);
ExportSuccess:=false;
Abort;
end;

//Temp是我自定义的目录;ExTbnm导出生成的文件名。
我的思路是如果导出成功,就会产生一个相对应的文件,可是我在判断文件是否存在的时候
就会弹出“导出文件出误”的对话框。当我将这个对话框关闭的时候,到磁盘的目录下面看
此文件是否存在的时候,这个文件明明存在呀,为什么会我的代码里面会找不到此文件呢。
此乃问题一。问题二:当我单步跟踪程序的时候,又能顺利通过,即能在指定的目录里面找到
此文件,这个是因为什么?

请问各位DFW,是不是winexec用的DOS命令(即BCP)的时候,windows会重新一个新进程。
我猜也可能上面的原因。如果情况是这样的话,问题接踵而来,那我如何得知这个进程(Bcp)
是否结述。

会的请不吝赐教,不会的请帮忙提前,谢谢!~

谢绝灌水,欢迎炼金!
 
在WinExec和if之间加上一点延时sleep(xxx);
呵呵,你总得让bcp把文件建立起来再判断吧.
 
原因:Winexec执行为异步执行。速度问题。
可以使用CreateProcess和WaitForSingleObject等来实现你的功能。
 
使用这个来完成这个

执行其他可执行程序,等待它执行完毕再继续执行自己,否则阻塞
function TFrm1.ExecAndWait(const Filename, Params: string; WindowState: word): boolean;
var SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
CmdLine := '"' + Filename + '"' + Params; { 注意检查长文件名}
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState;
end;

Result := CreateProcess(NIL, PChar(CmdLine), NIL, NIL,
FALSE,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL,
PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);
if Result then {等待结束 }
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
CloseHandle(ProcInfo.hProcess); {清理句柄 }
CloseHandle(ProcInfo.hThread);
end;
end;
 
var
sInfo : TStartUpInfo;
pInfo : TProcessInformation;
hInfo : Thandle;
InInt : Cardinal;
RunOk : longbool;
begin
FillChar(sInfo,sizeof(sInfo),#0);
with sInfo do
begin
cb := sizeof(sInfo);
dwFlags := StartF_UsesTDHandles or STARTF_USESHOWWINDOW;
lptitle := nil;
wShowWindow := SW_NORMAL;
end;
//为DOS程序、命令
RunOk := CreateProcess(nil,PChar(InPath),
nil,nil,False,HIGH_PRIORITY_CLASS and CREATE_NEW_CONSOLE,nil,nil,sInfo,pInfo)
//windows程序
RunOk := CreateProcess(PChar(InPath),
nil,nil,nil,False,HIGH_PRIORITY_CLASS and CREATE_NEW_CONSOLE,nil,nil,sInfo,pInfo);
if RunOk then
begin
hInfo := OpenProcess(PROCESS_ALL_ACCESS, FALSE,pInfo.dwProcessId );
WaitForSingleObject(pInfo.hProcess, INFINITE);//等待执行
end
else Application.MessageBox('出错!','失败',Mb_ok + Mb_iconError);
GetExitCodeProcess(hInfo,InInt);
end;

//可以用
if findwindow(nil,程序标题名) > 0 then
showmessage('运行中')
 
对不起,帮不上忙,帮你顶一下。
 
非常感谢LeeChange,yzhshi两位仁兄,综合两位的代码让我顺利通过,虽然昨天我由于引用
单元的错误而让我的系统死机,问题今天解决了。
也感谢IKE,任豆豆的参与。
 
后退
顶部