ImageVerifierCode 换一换
格式:DOCX , 页数:72 ,大小:676.49KB ,
资源ID:16465845      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16465845.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(进程 线程 DLL文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

进程 线程 DLL文档格式.docx

1、 创建/终止进程1问题阐述进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。2实现技巧CreateProcess()

2、函数的原型声明如下: BOOL CreateProcess(LPCTSTR lpApplicationName, / 可执行模块名LPTSTR lpCommandLine, / 命令行字符串LPSECURITY_ATTRIBUTES lpProcessAttributes, / 进程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttributes, / 线程的安全属性 BOOL bInheritHandles, / 句柄继承标志 DWORD dwCreationFlags, / 创建标志 LPVOID lpEnvironment, / 指向新的环境块的指针 LPCT

3、STR lpCurrentDirectory, / 指向当前目录名的指针 LPSTARTUPINFO lpStartupInfo, / 指向启动信息结构的指针 LPPROCESS_INFORMATION lpProcessInformation / 指向进程信息结构的指针 );3实例代码在程序设计时,某一个具体的功能模块可以通过函数或线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容可以考虑

4、将那些需要对地址空间中的数据进行访问的操作部分放到另外一个进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。具体地,可在进程中通过CreateProcess()函数去创建一个子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进程在运行期间的一个过程。为此,需要由父进程来掌握子进程的启动、执行和退出。下面这段代码即展示了此过程:CString sCommandLine; char cWindowsDirectoryMAX_PAT

5、H;char cCommandLineMAX_PATH;DWORD dwExitCode;PROCESS_INFORMATION pi;STARTUPINFO si = sizeof(si);/ 得到Windows目录 GetWindowsDirectory(cWindowsDirectory, MAX_PATH);/ 启动“记事本”程序的命令行 sCommandLine = CString(cWindowsDirectory) + NotePad.exe;:strcpy(cCommandLine, sCommandLine);/ 启动“记事本”作为子进程 BOOL ret = CreateP

6、rocess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL,&si, &pi);if (ret) / 关闭子进程的主线程句柄 CloseHandle(pi.hThread); / 等待子进程的退出 WaitForSingleObject(pi.hProcess, INFINITE); / 获取子进程的退出码 GetExitCodeProcess(pi.hProcess, &dwExitCode); / 关闭子进程句柄 CloseHandle(pi.hProcess); 4小结此段代码首先通过CreateProcess()创建Windo

7、ws自带的“记事本”程序为子进程,子进程启动后父进程通过WaitForSingleObject()函数等待其执行的结束,在子进程没有退出前父进程是一直处于阻塞状态的,这里子进程的作用同单线程中的函数类似。一旦子进程退出,WaitForSingleObject()函数所等待的pi.hProcess对象将得到通知,父进程将得以继续,如有必要可以通过GetExitCodeProcess()来获取子进程的退出代码。9.1.3 获取系统进程的技巧进程的定义是为执行程序指令的线程而保留的一系列资源的集合。进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步

8、对象等)组成。进程是一些所有权的集合,一个进程拥有内存、CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。系统统快照的获取可以通过Win32 API函数CreateToolhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。函数的声明如下: HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, /指定要创建包含哪一类系统信息的快照函数DWORD th32ProcessID /指定进程的ID号,当设定为0时表

9、示指定当前进程一旦系统得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:BOOL WINAPI Process32First(HANDLE hSnapshot,/ 系统快照句柄LPPROCESSENTRY32 lppe/ 指向结构体PROCESSENTRY32的指针BOOL WINAPI Process32Next(HANDLE hSnapshot, #include void CTestView:OnRButtonDown(UINT

10、nFlags, CPoint point)CString StrInfo=系统当前进程包括:nint nProcess =0;HANDLE snapshot=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) ;if(snapshot = NULL)return ;SHFILEINFO shSmall;PROCESSENTRY32 processinfo ;processinfo.dwSize=sizeof(processinfo) ;BOOL status=Process32First(snapshot,&processinfo) ;while

11、(status)ZeroMemory(&shSmall, sizeof(shSmall);SHGetFileInfo(processinfo.szExeFile,0,&shSmall,sizeof(shSmall),SHGFI_ICON|SHGFI_SMALLICON);StrInfo+=processinfo.szExeFile;StrInfo+=status = Process32Next (snapshot, &nProcess+;MessageBox(StrInfo,信息提示,MB_OK);CView:OnRButtonDown(nFlags, point);获取当前系统所有已启动的进

12、程,通常分为两个过程:首先获取系统进程快照,然后根据快照枚举进程。在Windows操作系统下,系统已为所有保存在系统内存中的进程、线程及模块等当前状态的信息制作了一个系统快照,用户可以通过对系统快照的访问完成对进程当前状态的检测。9.1.4 终止指定进程的技巧终止进程也就是结束进程,让进程从内存中卸载。进程的终止的原因一般有4种。主线程的入口函数返回。进程中的一个线程调用ExitProcess函数。次进程中的所有线程结束。其他进程中又有线程都结束。函数Process32First()和函数Process32Next()能够枚举系统中的所有进程,函数SHGetFileInfo()能够获得进程的信

13、息,一旦得到进程的标识号,就可以对进程进行终止。由于被管理进程在当前进程之外,因此进程首先通过OpenProcess()函数来获取一个已经存在的进程对象的句柄,然后才可以通过该句柄对指定的进程进行管理和控制。OpenProcess()函数的声明如下:HANDLE WINAPI OpenProcess(DWORD dwDesiredAccess,/访问标志BOOL bInheritHandle,/处理进程标志DWORD dwProcessId/进程标志号if(snapshot = NULL)return ;是否需要终止进程:if(AfxMessageBox(StrInfo,MB_YESNO)=I

14、DYES)DWORD dwProcessID=processinfo.th32ProcessID;HANDLE hProcess=:OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);TerminateProcess(hProcess,0);CloseHandle(hProcess);进程结束后,调用GetExitCodeProcess函数可以得到其退出代码,如果在调用这个函数时,目标进程还没有结束,此函数会返回STILL_ACTIVE,表示进程还在运行。9.1.5 使用文件映射机制实现进程间通信的技巧传统上都是用fread()、fwrite()之

15、类的函数来存取文件,而文件映射把部分文件或全部文件映射在process的内存空间中,因此可以像存取内存一样存取文件。下面我们介绍创建文件映射的方法。在介绍CreateFileMapping()函数之前,必须先创建CreateFile()函数和OpenFile()函数打开映射到内存空间的文件,取得文件的句柄。 CreateFileMapping()的函数声明:HANDLE CreateFileMapping(HANDLE hFile,/文件的句柄LPSECURITY_ATTRIBUTES lpAttributes,/与安全有关的设置DWORD flProtect,/用来决定与view有关的属性D

16、WORD dwMaximumSizeHigh,/设置映射文件的尺寸DWORD dwMaximumSizeLow,LPCTSTR lpName/文件映射对象的名称MapViewOfFile()函数的声明:LPVOID MapViewOfFile(HANDLE hFileMappingObject,/文件映射的句柄/此view的属性DWORD dwFileOffsetHigh,/view文件的起点DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap/映射区的大小/发送数据void CTestDlg:OnBnClickedBtnsendinfo()Upd

17、ateData(TRUE);/创建文件映像对象HANDLE hMapping;LPSTR StrData;hMapping=CreateFileMapping(HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,COMMUNICATIONif(hMapping=NULL)MessageBox(创建文件映像对象,return;/将文件映射到一个进程的地址空间上StrData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);if(StrData=NULL)AfxMessageBox(MapVi

18、ewOfFile() failed.文件映射失败/向映射内存写数据sprintf(StrData,m_StrSendData);/释放映像内存UnmapViewOfFile(StrData);/接收数据OnBnClickedBtnreceiveinfo()/获取映像内存的数据量m_StrReceiveData.Format(%s,StrData);UpdateData(FALSE);由于各个process之间是独立的,因此彼此之间无法存取对方的内存空间,这虽然是安全的保护机制,但是如果要两个process之间进行数据交换,那就又有问题了。不过win3又另外提供了一系列的进程通信的机制,帮助pr

19、ocess与另外一个process交换数据。9.1.6 使用消息实现进程间通信消息是Windows提供的一种驱动机制,在前面的章节中,已经多次使用消息解决问题了。使用消息进行进程通信的过程,就是使用消息激活某种操作的过程。对于进程间的通信,一般采用用户自定义的消息来完成进程间的通信,当然如果要实现的是Windows定义的消息功能,则完全可以使用已定义消息。例如完全可以在一个进程中向另一个进程中的EDIT发送WM_COPY消息,那么,如何用消息来完成进程间的通信呢?在进程间进行消息通信,那么进程之间首先应该约定唯一的确定的消息标识,这个消息标识必须是唯一的。定义了消息标识后,消息就可以通过就Po

20、stMessage,SendMessage或者PostThreadMessage函数给接收方进程的窗口发送消息。那么进程间通信还存在另外一个问题,就是消息发送给哪一个窗口,消息的发送方必须知道接收方的一个标识,比如窗口的句柄。所以在通信前,两个通信的进程之间要进行协商,确定消息的接收方的窗口标识。消息发送方可以通过FindWindow()/FindWindowEx()函数根据窗口的标题或者接收窗体的类名搜索窗口。所以在进程通信之间,进程双方将约定好窗口类名或者窗口的标题。前者只搜索顶层窗口,不搜索子窗口;而后者可以搜索子窗口,搜索的过程不区分大小写。可以用FindWindow搜索指定的窗口,然

21、后使用FindWindowEx来搜索它的子窗口。MFC封装了FindWindow函数,没有对FindWindowEx函数进行封装。FindWindow和FindwindowEx的原型如下:HWND FindWindow(LPCTSTR lpClassName,/窗口类名LPCTSTR lpWindowName/窗口标题)HWND FindwWindowEx(HWND hwndParent,/父窗口句柄HWND hwndChildAfter,/开始搜索的子窗口句柄LPCTSTR lpszClass,LPCTSTR lpszWindow)本节编写了两个程序:传输数据(Send.exe)和接收数据(

22、Recv.exe)。本例主要由Send.exe发送3个指令,Recv.exe接收这3个指令后,分别对这3个指令进行响应,根据指令改变窗口背景颜色。发送端程序设计,用MFC的AppWizard(exe)创建新项目Send,设置“Project name”为“Send”,单击【确定】按钮后进入创建应用程序类型,选择“Dialog Based”类型并单击【Finish】按钮。在对话框上增加3个按钮控件,在SendDlg.h中增加3个消息标识,对控件按钮的BN_CLICKED消息进行响应,其主要代码参考如下:void CSendDlg:OnRedBtn() CString strRecvWndName = ReceiverCWnd* pWnd = CWnd:FindWindow(NULL,strRecvWndName);if(pWnd)pWnd-PostMessage

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1