API 进程与线程函数delphi.docx
- 文档编号:3717677
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:17
- 大小:61.86KB
API 进程与线程函数delphi.docx
《API 进程与线程函数delphi.docx》由会员分享,可在线阅读,更多相关《API 进程与线程函数delphi.docx(17页珍藏版)》请在冰豆网上搜索。
API进程与线程函数delphi
WinAPI:
WinExec-运行外部程序
//声明
WinExec(
lpCmdLine:
LPCSTR;{文件名和参数;如没指定路径会按以下顺序查找:
程序目录/当前目录/System32/Windows/PATH环境变量}
uCmdShow:
UINT{启动选项}
):
UINT;
//返回值:
大于31{调用成功}
等于0{内存不足}
ERROR_FILE_NOT_FOUND=2;{文件名错误}
ERROR_PATH_NOT_FOUND=3;{路径名错误}
ERROR_BAD_FORMAT=11;{EXE文件无效}
//uCmdShow参数可选值:
SW_HIDE=0;{隐藏,并且任务栏也没有最小化图标}
SW_SHOWNORMAL=1;{用最近的大小和位置显示,激活}
SW_NORMAL=1;{同SW_SHOWNORMAL}
SW_SHOWMINIMIZED=2;{最小化,激活}
SW_SHOWMAXIMIZED=3;{最大化,激活}
SW_MAXIMIZE=3;{同SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE=4;{用最近的大小和位置显示,不激活}
SW_SHOW=5;{同SW_SHOWNORMAL}
SW_MINIMIZE=6;{最小化,不激活}
SW_SHOWMINNOACTIVE=7;{同SW_MINIMIZE}
SW_SHOWNA=8;{同SW_SHOWNOACTIVATE}
SW_RESTORE=9;{同SW_SHOWNORMAL}
SW_SHOWDEFAULT=10;{同SW_SHOWNORMAL}
SW_MAX=10;{同SW_SHOWNORMAL}
//举例,启动记事本:
procedureTForm1.Button1Click(Sender:
TObject);
begin
WinExec('notepad.exe',SW_SHOWNORMAL);
end;
WinAPI:
ShellExecute-打开外部程序或文件
ShellExecute(
hWnd:
HWND;{指定父窗口句柄}
Operation:
PChar;{指定动作,譬如:
open、print}
FileName:
PChar;{指定要打开的文件或程序}
Parameters:
PChar;{给要打开的程序指定参数;如果打开的是文件这里应该是nil}
Directory:
PChar;{缺省目录}
ShowCmd:
Integer{打开选项}
):
HINST;{执行成功会返回应用程序句柄;如果这个值<=32,表示执行错误}
//返回值可能的错误有:
=0{内存不足}
ERROR_FILE_NOT_FOUND=2;{文件名错误}
ERROR_PATH_NOT_FOUND=3;{路径名错误}
ERROR_BAD_FORMAT=11;{EXE文件无效}
SE_ERR_SHARE=26;{发生共享错误}
SE_ERR_ASSOCINCOMPLETE=27;{文件名不完全或无效}
SE_ERR_DDETIMEOUT=28;{超时}
SE_ERR_DDEFAIL=29;{DDE事务失败}
SE_ERR_DDEBUSY=30;{正在处理其他DDE事务而不能完成该DDE事务}
SE_ERR_NOASSOC=31;{没有相关联的应用程序}
//ShowCmd参数可选值:
SW_HIDE=0;{隐藏}
SW_SHOWNORMAL=1;{用最近的大小和位置显示,激活}
SW_NORMAL=1;{同SW_SHOWNORMAL}
SW_SHOWMINIMIZED=2;{最小化,激活}
SW_SHOWMAXIMIZED=3;{最大化,激活}
SW_MAXIMIZE=3;{同SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE=4;{用最近的大小和位置显示,不激活}
SW_SHOW=5;{同SW_SHOWNORMAL}
SW_MINIMIZE=6;{最小化,不激活}
SW_SHOWMINNOACTIVE=7;{同SW_MINIMIZE}
SW_SHOWNA=8;{同SW_SHOWNOACTIVATE}
SW_RESTORE=9;{同SW_SHOWNORMAL}
SW_SHOWDEFAULT=10;{同SW_SHOWNORMAL}
SW_MAX=10;{同SW_SHOWNORMAL}
//举例说明更多问题(别忘了usesShellAPI;):
{譬如用记事本打开一个文件}
begin
ShellExecute(Handle,'open','notepad.exe','C:
\WINDOWS\SchedLgU.Txt',nil,SW_SHOWNORMAL);
end;
{第一个参数是用来当作错误提示窗口的父窗口的,不能是nil,可以是0(也就是桌面窗口)}
begin
ShellExecute(0,'open','notepad.exe','C:
\WINDOWS\SchedLgU.Txt',nil,SW_SHOWNORMAL);
end;
{第二个参数如果是nil,也会默认位open}
begin
ShellExecute(0,nil,'notepad.exe','C:
\WINDOWS\SchedLgU.Txt',nil,SW_SHOWNORMAL);
end;
{文件路径可以放在参数五}
begin
ShellExecute(0,nil,'notepad.exe','SchedLgU.Txt','C:
\WINDOWS',SW_SHOWNORMAL);
end;
{把参数三直接指定为要打开的文件,文件将用对应默认程序打开;次数参数四应为nil}
begin
ShellExecute(0,nil,'SchedLgU.Txt',nil,'C:
\WINDOWS',SW_SHOWNORMAL);
end;
{如果文件在:
程序目录/当前目录/System32/Windows/PATH环境变量中,参数五也可以nil}
begin
ShellExecute(0,nil,'SchedLgU.Txt',nil,nil,SW_SHOWNORMAL);
end;
{如果参数三是个文件,可以用参数二命令打印}
begin
ShellExecute(0,'print','SchedLgU.Txt',nil,nil,1);
end;
{用IE打开网页}
begin
ShellExecute(Handle,'open','IExplore.EXE','about:
blank',nil,SW_SHOWNORMAL);
end;
{用火狐打开网页}
begin
ShellExecute(Handle,'open','firefox.exe','about:
blank',nil,SW_SHOWNORMAL);
end;
{用默认浏览器打开网页}
begin
ShellExecute(Handle,'open','Explorer.exe','about:
blank',nil,SW_SHOWNORMAL);
end;
{还是用默认浏览器打开网页}
begin
ShellExecute(0,nil,'',nil,nil,1);
end;
WinAPI:
LoadLibrary、FreeLibrary-载入与载卸模块
//声明:
LoadLibrary({将可执行模块映射到调用进程的地址空间}
lpLibFileName:
PChar{DLL或EXE文件名;如没指定路径会按以下顺序查找:
程序目录/当前目录/System32/Windows/PATH环境变量}
):
HMODULE;{返回模块句柄}
FreeLibrary(
hLibModule:
HMODULE{模块句柄}
):
BOOL;
WinAPI:
GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId
{返回当前线程的虚拟句柄}
GetCurrentThread:
THandle;
{返回当前线程ID}
GetCurrentThreadId:
DWORD;
{返回当前进程的虚拟句柄}
GetCurrentProcess:
THandle;
{返回当前进程ID}
GetCurrentProcessId:
DWORD;
提示:
ID是系统唯一的标识.
所谓虚拟句柄,就是该句柄只在调用进程的进程中有效,也不能被继承;
如果用于其他进程需要用DuplicateHandle复制句柄;
GetCurrentProcess返回的虚拟句柄可以通过OpenProcess创建一个真实的句柄.
举例:
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,Grids;
type
TForm1=class(TForm)
StringGrid1:
TStringGrid;
procedureFormCreate(Sender:
TObject);
end;
var
Form1:
TForm1;
implementation
{$R*.dfm}
procedureTForm1.FormCreate(Sender:
TObject);
begin
StringGrid1.Cells[0,0]:
='当前线程虚拟句柄:
';
StringGrid1.Cells[0,1]:
='当前线程ID:
';
StringGrid1.Cells[0,2]:
='当前进程虚拟句柄:
';
StringGrid1.Cells[0,3]:
='当前进程ID:
';
StringGrid1.Cells[1,0]:
=IntToStr(GetCurrentThread);
StringGrid1.Cells[1,1]:
=IntToStr(GetCurrentThreadID);
StringGrid1.Cells[1,2]:
=IntToStr(GetCurrentProcess);
StringGrid1.Cells[1,3]:
=IntToStr(GetCurrentProcessId);
{下面是显示格式的调整}
StringGrid1.Align:
=alClient;
StringGrid1.FixedRows:
=0;
StringGrid1.RowCount:
=4;
StringGrid1.ColCount:
=2;
StringGrid1.ColWidths[0]:
=StringGrid1.Canvas.TextWidth(StringGrid1.Cells[0,0])+4;
StringGrid1.ColWidths[1]:
=StringGrid1.Canvas.TextWidth(StringGrid1.Cells[0,1])+4;
end;
end.
//效果图:
WinAPI:
GetWindowThreadProcessId-获取指定窗口的进程ID或线程ID
//声明:
GetWindowThreadProcessId(
hWnd:
HWND;{指定窗口句柄}
lpdwProcessId:
Pointer=nil{返回进程ID的指针}
):
DWORD;{返回线程ID}
//举例:
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,Grids;
type
TForm1=class(TForm)
procedureFormCreate(Sender:
TObject);
end;
var
Form1:
TForm1;
implementation
{$R*.dfm}
procedureTForm1.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;
end.
WinAPI:
OpenProcess、GetExitCodeProcess、TerminateProcess(测试强制关闭OICQ)
//声明:
{返回进程的句柄}
OpenProcess(
dwDesiredAccess:
DWORD;{访问选项}
bInheritHandle:
BOOL;{能否继承;True表示能用CreateProcess继承句柄创建新进程}
dwProcessId:
DWORD{指定进程ID}
):
THandle;{成功会返回进程句柄;失败返回0}
//dwDesiredAccess可选值:
PROCESS_TERMINATE=$0001;{允许TerminateProcess使用进程句柄来关闭进程}
PROCESS_CREATE_THREAD=$0002;{允许CreateRemoteThread使用进程句柄来创建线程}
PROCESS_VM_OPERATION=$0008;{允许VirtualProtectEx使用进程句柄来改变进程的虚拟内存}
PROCESS_VM_READ=$0010;{允许ReadProcessMemory使用进程句柄从进程的虚拟内存中读取数据}
PROCESS_VM_WRITE=$0020;{允许WriteProcessMemory使用进程句柄向进程的虚拟内存中写入数据}
PROCESS_DUP_HANDLE=$0040;{允许DuplicateHandle把进程句柄当作源句柄或目标句柄进行复制}
PROCESS_CREATE_PROCESS=$0080;{默认值}
PROCESS_SET_QUOTA=$0100;{允许SetProcessWorkingSetSize使用进程句柄来来设置虚拟内存的上限值}
PROCESS_SET_INFORMATION=$0200;{允许SetPriorityClass使用进程句柄来设置进程优先级}
PROCESS_QUERY_INFORMATION=$0400;{允许GetExitCodeProcess或GetPriorityClass通过进程句柄读取进程信息}
SYNCHRONIZE=$00100000;{允许任何等待的函数使用进程句柄}
PROCESS_ALL_ACCESS=(STANDARD_RIGHTS_REQUIREDorSYNCHRONIZEor$FFF);{允许所有权限}
{获取指定进程的退出码}
GetExitCodeProcess(
hProcess:
THandle;{进程句柄}
varlpExitCode:
DWORD{接收退出码}
):
BOOL;{}
{强制结束(其他)进程}
TerminateProcess(
hProcess:
THandle;{进程句柄}
uExitCode:
UINT{退出码}
):
BOOL;{}
//提示:
关闭其他程序一般应该是向其主窗口发送WM_CLOSE消息,不行再用这个,因为它不能关闭其关联的DLL.
//举例(强行关闭OICQ的办法):
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls;
type
TForm1=class(TForm)
Button1:
TButton;
procedureButton1Click(Sender:
TObject);
end;
var
Form1:
TForm1;
implementation
{$R*.dfm}
procedureTForm1.Button1Click(Sender:
TObject);
var
id:
Cardinal;
wh:
HWND;
ph:
THandle;
ExitCode:
DWORD;
begin
wh:
=FindWindow('#32770',nil);
GetWindowThreadProcessId(wh,id);
ph:
=OpenProcess(PROCESS_TERMINATE,False,id);
GetExitCodeProcess(ph,ExitCode);
TerminateProcess(ph,ExitCode);
end;
end.
提示:
#32770是提前知道的类名,获取方法可参见:
GetWindowThreadProcessId函数请参见:
WinAPI:
GetModuleHandle-获取一个模块(exe或dll)的句柄
定义:
GetModuleHandle(
lpModuleName:
PChar{模块名;只能是映射到当前进程的模块}
):
HMODULE;{返回模块句柄;0表示失败}
举例:
//获取当前模块的句柄
var
s:
string;
h:
Cardinal;
begin
{先取得模块名}
s:
=Application.ExeName;
s:
=ExtractFileName(s);
{获取参数只要模块名就够了;不需要路径(测试中有路径也可以)}
h:
=GetModuleHandle(PChar(s));
ShowMessage(IntToStr(h));{4194304}
end;
//用nil做参数即可获取当前模块的句柄
var
h:
Cardinal;
begin
h:
=GetModuleHandle(nil);
ShowMessage(IntToStr(h));{4194304}
end;
//获取系统骨干模块Gdi32.dll的句柄
var
h:
Cardinal;
begin
h:
=GetModuleHandle('Gdi32.dll');
ShowMessage(IntToStr(h));{2012151808}
end;
//能不能获取记事本的句柄?
var
h:
Cardinal;
begin
h:
=GetModuleHandle('notepad.exe');
ShowMessage(IntToStr(h));{0;失败}
{因为当前进程和记事本的进程是相互独立的;}
{如果用能够冲破进程、面向全局的dll应该可以.}
end;
WinAPI:
GetModuleFileName、GetModuleHandle
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls;
type
TForm1=class(TForm)
Button1:
TButton;
procedureFormCreate(Sender:
TObject);
procedureButton1Click(Sender:
TObject);
end;
var
Form1:
TForm1;
implementation
{$R*.dfm}
procedureTForm1.FormCreate(Sender:
TObject);
var
buf:
array[0..MAX_PATH]ofChar;
hinst:
HMODULE;
begin
{获取指定模块的句柄}
hinst:
=GetModuleHandle('gdi32.dll');
{获取模块的路径}
GetModuleFileName(hinst,buf,Length(buf));
ShowMessage(buf);{C:
\WINDOWS\system32\GDI32.dll}
end;
procedureTForm1.Button1Click(Sender:
TObject);
var
buf:
array[0..MAX_PATH]ofChar;
begin
{当GetModuleFileName的第一个参数为0或HInstance时,会获取当前模块路径}
GetModuleFileName(0,buf,Length(buf));
ShowMessage
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- API 进程与线程函数delphi 进程 线程 函数 delphi