线程和进程函数:
1.WinExec - 运行外部程序
//声明
WinExec(
lpCmdLine: LPCSTR; {文件名和参数; 如没指定路径会按以下顺序查找: 程序目录/当前目录/System32/Windows/PATH环境变量}
uCmdShow: UINT {启动选项}
): UINT;
//举例, 启动记事本:
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExec('notepad.exe', SW_SHOWNORMAL);
end;
2.ShellExecute - 打开外部程序或文件
ShellExecute(
hWnd: HWND; {指定父窗口句柄}
Operation: PChar; {指定动作, 譬如: open、print}
FileName: PChar; {指定要打开的文件或程序}
Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil}
Directory: PChar; {缺省目录}
ShowCmd: Integer {打开选项}
): HINST; {执行成功会返回应用程序句柄; 如果这个值 <= 32, 表示执行错误}
begin
ShellExecute(0, nil, 'http://del.cnblogs.com', nil, nil, 1);
end;
3. LoadLibrary、FreeLibrary - 载入与载卸模块
//声明:
LoadLibrary( {将可执行模块映射到调用进程的地址空间}
lpLibFileName: PChar {DLL 或 EXE 文件名; 如没指定路径会按以下顺序查找: 程序目录/当前目录/System32/Windows/PATH环境变量}
): HMODULE; {返回模块句柄}
FreeLibrary(
hLibModule: HMODULE {模块句柄}
): BOOL;
procedure TForm1.FormPaint(Sender: TObject);
var
h: THandle;
bit: TBitmap;
begin
h := LoadLibrary('c:\temp\Project1.dll'); {载入 DLL}
bit := TBitmap.Create;
bit.LoadFromResourceName(h, 'img1'); {提取资源}
Canvas.Draw(10, 10, bit); {在窗体上绘制图片}
FreeLibrary(h); {载卸 DLL}
bit.Free;
end;
4.
{返回当前线程的虚拟句柄}
GetCurrentThread: THandle;
{返回当前线程 ID}
GetCurrentThreadId: DWORD;
{返回当前进程的虚拟句柄}
GetCurrentProcess: THandle;
{返回当前进程 ID}
GetCurrentProcessId: DWORD;
提示:
ID 是系统唯一的标识.
所谓虚拟句柄, 就是该句柄只在调用进程的进程中有效, 也不能被继承;
如果用于其他进程需要用 DuplicateHandle 复制句柄;
GetCurrentProcess 返回的虚拟句柄可以通过 OpenProcess 创建一个真实的句柄.
5.GetWindowThreadProcessId - 获取指定窗口的进程 ID 或线程 ID
//声明:
GetWindowThreadProcessId(
hWnd: HWND; {指定窗口句柄}
lpdwProcessId: Pointer = nil {返回进程 ID 的指针}
): DWORD; {返回线程 ID}
procedure TForm1.FormCreate(Sender: TObject);
var
c: Cardinal;
begin
GetWindowThreadProcessId(Handle, @c);
ShowMessage(IntToStr(c)); {2792; 随机的}
{在本例中相同于 GetCurrentProcessID 的结果}
c := GetCurrentProcessID;
ShowMessage(IntToStr(c)); {2792}
c := GetWindowThreadProcessId(Handle, nil);
ShowMessage(IntToStr(c)); {2748}
{在本例中相同于 GetCurrentThreadID 的结果}
c := GetCurrentThreadID;
ShowMessage(IntToStr(c)); {2748}
end;
6.获取指定进程的退出码}
GetExitCodeProcess(
hProcess: THandle; {进程句柄}
var lpExitCode: DWORD {接收退出码}
): BOOL; {}
--------------------------------------------------------------------------------
{强制结束(其他)进程}
TerminateProcess(
hProcess: THandle; {进程句柄}
uExitCode: UINT {退出码}
): BOOL; {}
//提示: 关闭其他程序一般应该是向其主窗口发送 WM_CLOSE 消息, 不行再用这个, 因为它不能关闭其关联的 DLL.
7.GetModuleHandle - 获取一个模块(exe 或 dll)的句柄
定义:
GetModuleHandle(
lpModuleName: PChar {模块名; 只能是映射到当前进程的模块}
): HMODULE; {返回模块句柄; 0 表示失败}
8.根据窗口句柄获取所在程序路径 -
uses PsAPI; {GetModuleFileNameEx 函数需要它}
{根据窗口句柄获取所在程序路径的函数}
function GetProcessExePath(h: HWND): string;
var
pid: Cardinal;
pHandle: THandle;
buf: array[0..MAX_PATH] of Char;
begin
{先获取进程 ID}
GetWindowThreadProcessId(h, @pid);
{再获取进程句柄}
pHandle := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
{获取进程路径}
GetModuleFileNameEx(pHandle, 0, buf, Length(buf));
CloseHandle(pHandle);
Result := buf;
end;
{测试当前程序}
procedure TForm1.Button1Click(Sender: TObject);
var
path: string;
begin
path := GetProcessExePath(Handle);
ShowMessage(path);
end;
{测试记事本 - 需要随便打开一个记事本}
procedure TForm1.Button2Click(Sender: TObject);
var
wh: HWND;
path: string;
begin
wh := FindWindow('Notepad', nil);
path := GetProcessExePath(wh);
ShowMessage(path);
end;
9.遍历进程并获取进程路径 -
uses PsAPI;
procedure TForm1.Button1Click(Sender: TObject);
const
n = 512;
var
IDArr: array[0..n-1] of DWORD;
size,i: DWORD;
buf: array[0..MAX_PATH] of Char;
pHandle: THandle;
begin
// FillChar(buf, n, #0); {这样可避免乱码}
EnumProcesses(@IDArr, n, size);
for i := 0 to size div SizeOf(DWORD) - 1 do
begin
pHandle := OpenProcess(PROCESS_ALL_ACCESS, False, IDArr[i]);
GetModuleFileNameEx(pHandle, 0, buf, Length(buf)*SizeOf(buf[0]));
CloseHandle(pHandle);
Memo1.Lines.Add(buf);
end;
end;