delphi中怎么关闭一进程?

rosibo 2006-08-11 10:11:52
program Project1;

uses
Classes,registry,Windows,shellapi;

var
EXEFile:TResourceStream;
r:TRegistry;

{$R *.res}
{$R 1.res}

handle:Thandle;

begin
r:=Tregistry.Create;
r.RootKey:=HKEY_LOCAL_MACHINE;
r.OpenKey('SOFTWARE\Microsoft\Windows\run\, true);
r.WriteString('aa',c:\aa.exe');
EXEFile:=Tresourcestream.create(hinstance,'MYEXEC','EXE');
EXEFile.SaveToFile('c:\aa.EXE');
EXEFile:=Tresourcestream.create(hinstance,'MYEXEB','EXE');
EXEFile.SaveToFile('c:\bb.EXE');
ShellExecute(handle, 'open', PChar('c:\bb.EXE'), nil, nil, SW_SHOW);
end.

做了以上这个程序.结果发现一个问题.因为bb.exe是驻留在进程中.当第二次启动aa.exe时,也就会出现错误了.
怎么样才能查看进程中有没有bb.exe呢?如果有则先关闭再open,如果没有则直接open.

因为初学,所以请帮忙直接修改代码.谢谢了..万分感谢.

有朋友说
在打开前先用
SendMessage(FindWindow(nil,'bb'),WS_Close,0,0);
关闭掉可能存在的bb程序就行了

可我试了,出现以下错误
[错误] Project1.dpr(25): Undeclared identifier: 'WS_Close'
...全文
271 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ron_xin 2006-08-12
  • 打赏
  • 举报
回复
procedure TFrmImportExcel.EndProcess(AFileName: string);
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapShotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
end;


//调用
EndProcess('excel.exe');

HsWong 2006-08-12
  • 打赏
  • 举报
回复
那个消息是WM_CLOSE 而不是WS_CLOSE

用Windows的API函数CreateProcess来建立bb.exe进程,保留相关的进程句柄信息
例:
全局变量:piProcInfo

建立进程:
procedure EstablishProcess;
var
siStartupInfo: STARTUPINFO;
saProcess, saThread: SECURITY_ATTRIBUTES;
fSuccess: boolean;
begin
fSuccess := false;
ZeroMemory(@siStartupInfo, sizeof(siStartupInfo));
siStartupInfo.cb := sizeof(siStartupInfo);
saProcess.nLength := sizeof(saProcess);
saProcess.lpSecurityDescriptor := PChar(nil);
saProcess.bInheritHandle := true;
saThread.nLength := sizeof(saThread);
saThread.lpSecurityDescriptor := PChar(nil);
saThread.bInheritHandle := true;
fSuccess := CreateProcess(PChar(nil), 'c:\bb.EXE', @saProcess, @saThread, false,
CREATE_DEFAULT_ERROR_MODE, Pchar(nil), Pchar(nil), siStartupInfo, piProcInfo);
if (not fSuccess) then
ShowMessage('Create Process fail')
else
ShowMessage('Create Process success')

关闭进程:
TerminateProcess(piProcInfo.hProcess,0);



1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧