在后台运行DOS程序,退出后不在系统任务栏中
出现winoldap进程的实现
下面是我在大富翁上拉下来的一个例子,测试非常成功 - 真是不留一点痕迹!
1.功能函数
function WinExecAndWait32(FileName:String; Visibility : integer): DWORD;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(
nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo { pointer to PROCESS_INF }
)
then Result := $FFFFFFFF else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;
2.使用例程
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExecAndWait32('COMMAND.COM /C COPY C:/AUTOEXEC.BAT D:/',SW_NORMAL);
showmessage('ok');
end;
3.下载例程
4. 补充说明 没翻译完在win32.hlp中输入StartupInfo,CreateProcess自己查看吧.
翻译的Win32API帮助, E文很臭,有误人子弟的地方请参考帮助.
TStartupInfo一些说明:
StartupInfo结构被CreateProcess函数用来指定一个新建立的线程主
窗口的属性,对于GUI(Graphics User Interface)线程来说,这些信息
影响CreateWindow函数建立和ShowWindow函数显示的第一个窗口.而对
控制台程序,这些信息影响线程建立的新的控制台程序.当一个线程建
立后,能够利用GetStartupInfo函数获取一些StartupInfo的信息.
如果要指定外部程序的启动位置和窗口大小,需要对 StartupInfo的参数进行设定。
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESIZE or STARTF_USEPOSITION ;
Size 与Postion 才有作用。如果不起作用,请参考http://blog.csdn.net/wjw806/archive/2008/05/04/2386073.aspx的说明注意事项。
typedef struct _STARTUPINFO { // si
DWORD cb; //指定该结构的大小(字节数)
LPTSTR lpReserved; //保留.在该结构通过CreateProcess之前,
//设置该成员为NULL.
LPTSTR lpDesktop; //仅仅Windows NT支持.
LPTSTR lpTitle; //对控制台程序来说,lpTitle在新建的控制台程序
//窗口标题栏中显示.如果lpTitle=NULL,可执行文
//件的名字显示在标题栏中.如果为GUI程序或不建立
//新窗口控制台程序,lpTitlel的值一定要设置为Null
DWORD dwX; //当dwFlags为STARTF_USEPOSITION才起作用.控制窗口
//左上角相对屏幕的位置.单位是像素.对GUI程序来说,
//新程序调用CreateWindow(参数x=CW_USEDEFAULT)建
//立一个OverLap窗口时,首先使用指定的位置.
DWORD dwY; //见上.
DWORD dwXSize; //当dwFlags为STARTF_USESIZE才起作用.指定窗口的长宽
//单位是像素.对GUI程序来说,新程序调用CreateWindow
//(参数nWidth=CW_USEDEFAULT)建立一个OverLap窗口时,首先使
//用指定的长宽.
DWORD dwYSize; //见上.
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
/////////////////////////////////////
TStartupInfo 这个结构中有一个 sShowWindow 栏位, 将之设为 SW_HIDE即可,
同时, dwFlags 标志中至少需含有 STARTF_USESHOWWINDOW, 否则CreateProcess
时, sShowWindow 栏位的设定会无效, 以下是修改过的程式:
var
sCommandLine: string;
bCreateProcess: boolean;
lpStartupInfo: TStartupInfo;
lpProcessInformation: TProcessInformation;
begin
// sCommandLine 的内容请视您的情况修改
sCommandLine :='Xcopy d:/temp/temp1/*.* d:/temp/temp2 /v/y';
lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_HIDE;
bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil,nil,True,