获得HANDLE(100分)

  • 主题发起人 主题发起人 歪就歪
  • 开始时间 开始时间

歪就歪

Unregistered / Unconfirmed
GUEST, unregistred user!
对不起,我知道类似问题已经被问的很多遍了,但还是不
知道该怎么做。

用CreateProcess运行一个……比如:Notepad.exe,似乎应该返回
该运行程序的HANDEL才是。但事实上却不是。如果用
CreateProcess + FindWindow去找,在同时运行着几个exe程序时,就
无法确定是哪一个是你运行的。
 
调用外部程序并知道它的运行状态


Function {TCustomExecExtApp.}Execute(ComLine : String):boolean;
var
FAppHandle : THandle;
lpAppName : pchar;
lpTitle : Pchar;
StartInfo : TStartupInfo;
FProcessInfo : TProcessInformation;
begin
if (Length(ComLine)+2)>255 then
begin
SetError(-1,'Command Line Too Long!');
Result := false;
exit;
end;

GetMem(lpAppName,MaxPath);
GetMem(lpTitle,MaxPath);

StrPCopy(lpAppName,ComLine);
StrPCopy(lpTitle,ComLine);
//init StartInformation
StartInfo.cb:=sizeof(TStartupInfo);
StartInfo.lpReserved := NIL;
StartInfo.lpDesktop:=NIL;
StartInfo.lpTitle := lpTitle;
StartInfo.dwFillAttribute := 0;
StartInfo.cbReserved2 :=0;
StartInfo.lpReserved2 := NIL;
//这个参数控制Create Window形态
//STARTF_USESHOWWINDOW 指定这个标志位,指示用ShowWindow的参数建立窗口
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.wShowWindow := FWinStyle;

//CreateProcess 在Windows.pas中的一个原形
//function CreateProcessA(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar;
//lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
//bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
//lpCurrentDirectory: PAnsiChar; const lpStartupInfo: TStartupInfo;
//var lpProcessInformation: TProcessInformation): BOOL; stdcall;

//Clear ProcessInfo Structure
FProcessInfo.hProcess := 0;
FProcessInfo.hThread := 0;
FProcessInfo.dwProcessId := 0;
FProcessInfo.dwThreadId := 0;

//Create process
if CreateProcess(NIL,
lpAppName,
nil,
nil,
False,
0,
nil,
nil,
StartInfo,
FProcessInfo) then
begin //Command Executed
//为进程建立可查询的属性。
FAppHandle := OpenProcess(PROCESS_QUERY_INFORMATION,False,FProcessInfo.dwProcessId);
//建立可查询的属性后可用于GetExitCodeProcess,在Delphi中查询外部程序是
//否还在运行,这个函数在W95,W98,NT40下均可用.
//注意:FAppHandle要改成Form的变量,以便其它函数可以使用.
// GetExitCodeProcess(FAppHandle,FAppState);
// if FAppState<>STILL_ACTIVE then
// 外部程序已结束
// else
// 外部程序还在运行
end
else //false Create Process;
begin
SetError(-2,'Can not create process!');
Result := false;
end;

FreeMem(lpAppName);
FreeMem(lpTitle);
end;
 
谢谢!预祝圣诞快乐!
 

Similar threads

后退
顶部