|
发表于 2009-6-18 17:57:20
|
显示全部楼层
呵呵,比我想象的代码要差。
Lazarus为了兼容多平台,建议用TProcess来启动程序。在那些启动后不管的程序,可以这样,但是对于某些文件的打开就有问题了。比如启动word文档什么的。还有一点很奇怪,如果用WaitForSingleObject来实现RUNWAIT功能是要注意不能用INFINITY参数,而是应该用一小段时间加Application.ProcessMessage的循环来实现。否则会出现有些程序无法启动,同时导致原来的程序僵死。
下面是我的一段用于WINCE的RUNWAIT代码,分享一下,其中的ShellExecute可以用CreateProcess代替- function RunWait(FileName: WideString): boolean;
- var
- info: SHELLEXECUTEINFO;
- ret: DWORD;
- begin
- FillChar(info, SizeOf(info), 0);
- info.cbSize := SizeOf(info);
- info.lpFile := PWideChar(FileName);
- info.lpVerb := nil;
- info.fMask := $440;
- //SEE_MASK_NOCLOSEPROCESS($00000040)|SEE_MASK_FLAG_NO_UI($00000400);
- info.dwHotKey := 0;
- info.hIcon := 0;
- info.hInstApp := 0;
- info.hkeyClass := 0;
- info.hProcess := 0;
- info.hwnd := 0;
- info.lpClass := nil;
- info.lpDirectory := nil;
- info.lpIDList := nil;
- info.lpParameters := '';
- info.nShow := SW_SHOW;
- ShellExecuteEx(@info);
- if info.hProcess < 32
- then Exit(False);
- Application.ProcessMessages;
- repeat
- ret := WaitForSingleObject(info.hProcess, 500);
- Application.ProcessMessages;
- until ret <> WAIT_TIMEOUT;
- Exit(True);
- end;
复制代码 |
|