Delphi Thread 进程和线程函数(1)

线程和进程函数:

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;

 

你可能感兴趣的:(线程,Delphi)