delphi如何用程序实现探测当前系统的所有进程,并终止某一进程。请高手帮助!!!!!现在做一软件自动升级,想升级时,如果当前自己的应用程序运行时自动关闭它。然后再进行下面的操作。高手指教。在线等待!!1
解决方案 »
- 麦克风测试
- 求一个类似 EXCEL 的 grid 控件, 最好可以直接导入 Excel 文件.
- 问个报表的难题~~不知大家有没碰到过~~~各位帮帮我~~
- 我用ToolBar做MDI程序的主菜单,为何在子窗口菜单不能加到主窗口的ToolBar菜单里呢? 我以做了,GroupIndex设置呢.为什么还不对?
- 文件夹之间的对比,拷贝
- 怎么传值?比如单击DBGRID中的一个COLUMN就可以把值传到一张报表的QRDBTEXT上
- 在FormulaOne中怎样实现在单元格中存放字符串而不显示出来(急急急)
- 急问!!请大家指点一下!
- delphi6中 Corba data object 中怎么用ado呢? 为什么总不行?
- Delphi Indy10 IdUDPServer和IdUDPClient怎么使用?
- 关于Dbgrid的问题?
- 请问如何完全编译程序?(30分相送)急!急!急!
step 1: 重载软件程序主窗体Create构造函数(第一个窗体)
void __fastcall MForm1::CreateParams(TCreateParams & Params)
{
MForm::CreateParams(Params);
strcpy(Params.WinClassName,"Rikky"); //设置应用程序名称为Rikky
}step 2: 在升级程序中加入检测程序Rikky有没有实例在运行,(这样的话,升级程序和软件主程序Rikky必须是两个程序,当然软件主程序可以调用一个)
//----
HWND hWndCalc=FindWindow("Rikky",NULL);
if(hWndCalc>0)
{
ShowMessage("已经运行了");
//此处加入你想做的事,也就是关闭它
}
//----
//下面开始初始化工作,以及创建窗体
Application->Initialize();
var
hSnap : THandle;
TTHe : TTHreadEntry32;
TMod : TModuleEntry32;
// THL : THeapList32;
// THE : THeapEntry32;
begin
hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPALL,0);
TTHe.dwSize := SizeOf(TTHreadEntry32);
TMod.dwSize := SizeOf(TModuleEntry32);
// THL.dwSize := SizeOf(THeapList32);
// THE.dwSize := SizeOf(THeapEntry32);
if Thread32First(hSnap,TThe) then begin
Repeat
if TTHe.th32OwnerProcessID = PP(ID)^.ProcessID then begin
with ListView1.Items.Add do begin
Caption := Format('%x',[TThe.th32ThreadID]);
SubItems.Add(Format('%d',[TThe.cntUsage]));
SubItems.Add(inttostr(TThe.tpBasePri));
SubItems.Add(inttostr(TThe.tpDeltaPri))
end ;
end;
until NOT Thread32Next(hSnap,TThe);
end;
CloseHandle(hSnap);
hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE,PP(ID)^.ProcessID);
if Module32First(hSnap,TMod) then begin
Repeat
with ListView2.Items.Add do begin
Caption := (TMod.szModule);
SubItems.Add(TMod.szExePath);
SubItems.Add(inttostr(TMod.GlblcntUsage));
SubItems.Add(inttostr(TMod.ProccntUsage));
SubItems.Add(inttostr(TMod.modBaseSize));
end;
until NOT Module32Next(hSnap,TMod);
end;
CloseHandle(hSnap);
// showmessage(inttostr(dword(ID^)));
hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPALL,PP(ID)^.ProcessID);
if Heap32ListFirst(hSnap,THL) then begin
repeat
if Heap32First(THE,THL.th32ProcessID,THL.th32HeapID) then begin
repeat
with ListView3.Items.Add do begin
Caption := Format('%x',[THL.th32HeapID]);
SubItems.Add(Format('%x',[THE.dwAddress]));
SubItems.Add(inttostr(THE.dwBlockSize));
SubItems.Add(inttostr(THE.dwFlags));
end;
until NOT Heap32Next(THE);
end;
until NOT Heap32ListNext(hSnap,THL);
end;
CloseHandle(hSnap);
end;
procedure tform1.getclienttask(); //取得客户端的所有进程
const
PROCESS_TERMINATE=$0001;
//进程的PROCESS_TERMINATE访问权限
var
SendCode:array[0..250] of char;
SendCodeStr:string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
//获取系统所有进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
//调用Process32First前用Sizeof(FProcessEntry32)填充FProcessEntry32.dwSize
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);
//获取快照中第一个进程信息并保存到FProcessEntry32结构体中
while integer(ContinueLoop) <> 0 do
begin
Sendtaskname:=ExtractFileName(FProcessEntry32.szExeFile);
begin
sendCodeStr:='task'+sendtaskname;
StrpCopy(sendCode,sendCodeStr);
cUDP.RemoteHost:='192.168.0.13';
cUDP.SendBuffer(sendCode,250);
end;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
prochand:Thandle;
ModHand: HMODULE;
modname:array [0..max_path] of char;
//str:string;
//cb_m:integer;
count:dword;
begin
ProcHand := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, getcurrentprocessid());
if prochand>0 then
begin
enumprocessmodules(prochand,@modhand,1,count);
if getmodulefilenameex(prochand,modhand,modname,sizeof(modname))>0 then
begin
//getmodulefilenameex(prochand,modhand,modname,sizeof(modname));
showmessage(modname);
end;
end;
end;但modname取得总是“?D?“,我代码错在哪里?