精华内容
下载资源
问答
  • win32 启动和结束进程

    2015-06-24 20:39:10
    CreateProcess函数的最后一个参数是一个指向PROCESS_INFORMATION结构体的指针,该结构的成员可以保存被创建进程的ID和句柄。新建按钮资源typedef struct _PROCESS_INFORMATION { HANDLE hProcess; //进程的句柄 ...

    CreateProcess函数的最后一个参数是一个指向PROCESS_INFORMATION结构体的指针,该结构的成员可以保存被创建进程的ID和句柄。

    新建按钮资源

    typedef struct _PROCESS_INFORMATION {  
        HANDLE hProcess; //进程的句柄  
        HANDLE hThread; //主线程的句柄  
        DWORD dwProcessId; //进程ID  
        DWORD dwThreadId; //主线程ID  
    } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;  

    CreateProcess函数的最后两个参数都是指针,因此我们在使用时,要先定义STARTUPINFO和PROCESS_INFORMATION类型的变量,并使用ZeroMemory函数将其成员初始化。ZeroMemory函数可以将一段内存中的数据初始化为0.

    PROCESS_INFORMATION pro_info; //进程信息  
    STARTUPINFO sti; //启动信息  
    //......  
    // 初始化两个结构体  
    ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));  
    ZeroMemory(&sti, sizeof(STARTUPINFO));  

    接着调用CreateProcess创建进程.

    CreateProcess(L"C:\\Windows\\System32\\calc.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pro_info);

    调用成功后,PROCESS_INFORMATION结构体的hProcess就保存了被创建的进程的句柄了。

    要结束进程,调用TerminateProcess函数,第一个参数就是刚才创建的时程的句柄,第二个参数是退出码,通过GetExitCodeProcess函数可以获取。

    DWORD exitCode; //退出码  
    //.........  
    GetExitCodeProcess(pro_info.hProcess,&exitCode); //获取退出码  
    TerminateProcess(pro_info.hProcess, exitCode);  
    // 关闭句柄  
    CloseHandle(pro_info.hThread);  
    CloseHandle(pro_info.hProcess);  

    再介绍一个在应用程序中运行其他程序的方法,那就是使用Shell函数——ShellExecute。

    HINSTANCE ShellExecute(  
      _In_opt_  HWND hwnd,  
      _In_opt_  LPCTSTR lpOperation,  
      _In_      LPCTSTR lpFile,  
      _In_opt_  LPCTSTR lpParameters,  
      _In_opt_  LPCTSTR lpDirectory,  
      _In_      INT nShowCmd  
    );  

    我们这里只是运行一个程序,没有其他操作,所以,带 In_opt的可选参数可以直接NULL,lpFile指定我们要运行程序的路径,如果是一个exe文件,那lpParameters可以指定命令行参数,但我们这里不需要,所以继续NULL,最后一个参数好理解,和ShowWindow函数一样。

    于是,用ShellExecute函数打开记事本程序,当然记得包含shellapi.h。

    ShellExecute(NULL,NULL,L"C:\\Windows\\System32\\notepad.exe",NULL,NULL,SW_SHOWNORMAL);  

    对话框中完整代码

    INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
            int wmId, wmEvent;
        case WM_COMMAND:
        {
                           wmId = LOWORD(wParam);
                           wmEvent = HIWORD(wParam);
                           switch (wmId)
                           {
                           case 1000:
                           {
                                        PROCESS_INFORMATION pro_info; //进程信息  
                                        STARTUPINFO sti; //启动信息  
                                        //......  
                                        // 初始化两个结构体  
                                        ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));
                                        ZeroMemory(&sti, sizeof(STARTUPINFO));
                                        /*sti.cb = sizeof(STARTUPINFO);
                                        sti.dwFlags = STARTF_USESHOWWINDOW;
                                        sti.wShowWindow = SW_SHOW;*/
    
                                        CreateProcess(L"C:\\Windows\\System32\\calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sti, &pro_info);
    
                           }
                               break;
                           case 1001:
                           {
                                        PROCESS_INFORMATION pro_info; //进程信息  
                                        STARTUPINFO sti; //启动信息  
                                        //......  
                                        // 初始化两个结构体  
                                        ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));
                                        ZeroMemory(&sti, sizeof(STARTUPINFO));
    
                                        DWORD exitCode; //退出码  
                                        //.........  
                                        GetExitCodeProcess(pro_info.hProcess, &exitCode); //获取退出码  
                                        TerminateProcess(pro_info.hProcess, exitCode);
                                        // 关闭句柄  
                                        CloseHandle(pro_info.hThread);
                                        CloseHandle(pro_info.hProcess);
                           }
                               break;
                           case 1002:
                           {
                                        ShellExecute(NULL, NULL, L"C:\\Windows\\System32\\notepad.exe", NULL, NULL, SW_SHOWNORMAL);
                           }
                           default:
                               return DefWindowProc(hDlg, msg, wParam, lParam);
                           }
        }
        }
        return (INT_PTR)FALSE;
    
    }
    展开全文
  • 第一部分: 根据进程名获取进程ID。 首先我们需要了解三个windows API函数: ...CreateToolhelp32Snapshot函数可以得到系统进程快照的句柄,如果函数调用成功返回快照句柄,否则返回INVALID_HA...

    第一部分:

    根据进程名获取进程ID。

    首先我们需要了解三个windows API函数:

    HANDLE WINAPI CreateToolhelp32Snapshot(
      DWORD dwFlags,
      DWORD th32ProcessID
    );

    CreateToolhelp32Snapshot函数可以得到系统进程快照的句柄,如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。函数包含在<tlhelp32.h>头中。

    BOOL WINAPI Process32First(
      HANDLE hSnapshot,
      LPPROCESSENTRY32 lppe
    );

    Process32First函数查找系统进程快照中的第一个进程。

    BOOL WINAPI Process32Next(
      HANDLE hSnapshot,
      LPPROCESSENTRY32 lppe
    );

    Process32Next函数配合Process32First函数通过循环列出系统中其它进程。

    查找特定进程的ID的函数如下所示:

    /*
    *@brief 根据进程名获取进程ID
    @param lpProcessName进程名称
    */
    DWORD __getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
    {
    	DWORD dwRet = 0;
    	HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	if (hSnapShot == INVALID_HANDLE_VALUE)
    	{
    		printf("\n获得进程快照失败,返回的GetLastError():%d", ::GetLastError());
    		return dwRet;
    	}
    
    	PROCESSENTRY32 pe32;//声明进程入口对象 
    	pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
    	::Process32First(hSnapShot, &pe32);//遍历进程列表 
    	do
    	{
    		if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID 
    		{
    			dwRet = pe32.th32ProcessID;
    			break;
    		}
    	} while (::Process32Next(hSnapShot, &pe32));
    	::CloseHandle(hSnapShot);
    	return dwRet;//返回 
    }
    

     

    第二部分

    通过进程名来终止进程。

    还是通过上面三个函数来查找特定的进程,不过还需要另外两个函数:

    HANDLE OpenProcess(
      DWORD dwDesiredAccess,
      BOOL  bInheritHandle,
      DWORD dwProcessId
    );

    OpenProcess函数用来打来一个进程。

    BOOL TerminateProcess(
      HANDLE hProcess,
      UINT   uExitCode
    );

    TerminateProcess用来终止给定的进程。

    实例如下:

    /*
     *@brief 根据进程名终止进程
     @param lpProcessName进程名称
     */
     BOOL __getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
     {
    	 BOOL processExist = true;
    	 HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	 if (hSnapShot == INVALID_HANDLE_VALUE)
    		 return processExist;
    	 PROCESSENTRY32 pe32;//声明进程入口对象 
    	 pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
    	 ::Process32First(hSnapShot, &pe32);//遍历进程列表 
    	 do
    	 {
    		 if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID 
    		 {
    			 HANDLE hGUI = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
    			 if (NULL == hGUI)
    				 return processExist;
    			 TerminateProcess(hGUI, 0);
    			 processExist = false;
    			 break;
    		 }
    	 } while (::Process32Next(hSnapShot, &pe32));
    	 ::CloseHandle(hSnapShot);
    	 return processExist;//返回 
     }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 最近工作上碰到无法结束进程的问题,上面这篇文章概况的很全面。 开发了个程序,创建了一个进程,但是杀不掉了,在任务管理器里面 右键--结束进程,提示“拒绝访问”,或者“没有此任务实例运行” 怎么办? ...

    转载自:https://www.cnblogs.com/jieliujas/p/9413064.html

    最近工作上碰到无法结束进程的问题,上面这篇文章概况的很全面。

     

    开发了个程序,创建了一个进程,但是杀不掉了,在任务管理器里面 右键--结束进程,提示“拒绝访问”,或者“没有此任务实例运行”

    怎么办?

    直接给答案:PCHunter

    具体方法:

    1.打开PCHunter,在进程选项卡下面可以找到无法结束的进程,右键--强制结束,失败(这儿效果跟任务管理器下的结束时一样的)

    2.这时候 右键--查看进程线程 ,然后将所有的线程给杀光光,再出来到进程选项卡下结束进程,OK

    我用了整整一天半才实现,这一天半我杀不掉进程重启电脑十几次,哎

    当然进程杀不死这个代表我的代码有问题,重点考虑的方向就是有通讯的线程一直在等待通讯,我还在查

     

    下面是网上搜索的其他方法:

    1.cmd -- tasklist--taskkill /im  进程名 /f  ,经过验证无效

    2.任务管理器-进程上右键--转到服务,先结束对应的服务,呵呵呵,我都不知道我的进程对应的是啥服务(其实在任务管理器-性能-资源监视器下可以查看进程对应的服务)

    3.cmd -- ntsd -c q -p 进程pid    ,验证无效

    4.任务管理器--查看--映像路径列--找到进程对应的文件所在目录,右键进程文件---360接触占用,解除失败

    5.cmd -- time /t(查看时间) --  at 15:34 /interactive taskmgr.exe(时间增加一分钟),验证无效

    6.使用工具 IceSword(冰刃),win7-64没有用

    7.使用工具 xueTr ,win7-64没有用(网上所有版本都没有用,我一个一个的下载验证的)

     

    展开全文
  • 跟我一起玩Win32开发(17):启动和结束进程

    万次阅读 多人点赞 2013-02-28 11:08:45
    我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Win32是个啥东西而已。 另外,在专访中,有些人也误认为我说C++非学不可,那也不是,我也提到过了,C++的学习可以使...

    这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧。

    我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Win32是个啥东西而已。

    另外,在专访中,有些人也误认为我说C++非学不可,那也不是,我也提到过了,C++的学习可以使你懂得更多知识,为你以为学习各种技术打下基础。

     

    今天,我们来了解一下,在应用程序中,如何启动一个进程,然后把这个进程结束掉。实现这一功能有替代方案,即使用.NET库中的System::Diagnostics::Process类来完成。在Win32中,启动一个进程可以理解为创建进程,所以可以调用CreateProcess函数,结束进程则调用TerminateProcess函数。

    唯一标识一个进程的是PID,而我们要对进程进行各项操作,进程也存在于内存中,也可以视为一种资源,我们知识,操作图标资源有HICON,操作位图资源有HBITMAP,同样道理,对进程所作的操作也要通过一个标识符(句柄)——HANDLE。

    CreateProcess函数的最后一个参数是一个指向PROCESS_INFORMATION结构体的指针,该结构的成员可以保存被创建进程的ID和句柄。

    typedef struct _PROCESS_INFORMATION {
        HANDLE hProcess; //进程的句柄
        HANDLE hThread; //主线程的句柄
        DWORD dwProcessId; //进程ID
        DWORD dwThreadId; //主线程ID
    } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

    接下来我们要对已创建进程进行的一系列操作,都以hProcess为纽带,包括获取退出码和终止进程。

    CreateProcess函数的最后两个参数都是指针,因此我们在使用时,要先定义STARTUPINFO和PROCESS_INFORMATION类型的变量,并使用ZeroMemory函数将其成员初始化。ZeroMemory函数可以将一段内存中的数据初始化为0.

    示例代码如下:

    PROCESS_INFORMATION pro_info; //进程信息
    STARTUPINFO sti; //启动信息
    //......
    // 初始化两个结构体
    ZeroMemory(&pro_info, sizeof(PROCESS_INFORMATION));
    ZeroMemory(&sti, sizeof(STARTUPINFO));
    


    接着调用CreateProcess创建进程.

    CreateProcess(L"C:\\Windows\\System32\\calc.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pro_info);

    调用成功后,PROCESS_INFORMATION结构体的hProcess就保存了被创建的进程的句柄了。

     

    要结束进程,调用TerminateProcess函数,第一个参数就是刚才创建的时程的句柄,第二个参数是退出码,通过GetExitCodeProcess函数可以获取。

    DWORD exitCode; //退出码
    //.........
    GetExitCodeProcess(pro_info.hProcess,&exitCode); //获取退出码
    TerminateProcess(pro_info.hProcess, exitCode);
    // 关闭句柄
    CloseHandle(pro_info.hThread);
    CloseHandle(pro_info.hProcess);
    


    下面是这个示例的运行结果图,完整的代码我稍后上传到资源区中。

     


    另外,再介绍一个在应用程序中运行其他程序的方法,那就是使用Shell函数——ShellExecute。

    HINSTANCE ShellExecute(
      _In_opt_  HWND hwnd,
      _In_opt_  LPCTSTR lpOperation,
      _In_      LPCTSTR lpFile,
      _In_opt_  LPCTSTR lpParameters,
      _In_opt_  LPCTSTR lpDirectory,
      _In_      INT nShowCmd
    );

    我们这里只是运行一个程序,没有其他操作,所以,带 _In_opt_的可选参数可以直接NULL,lpFile指定我们要运行程序的路径,如果是一个exe文件,那lpParameters可以指定命令行参数,但我们这里不需要,所以继续NULL,最后一个参数好理解,和ShowWindow函数一样。

    于是,用ShellExecute函数打开记事本程序,当然记得包含shellapi.h。

    ShellExecute(NULL,NULL,L"C:\\Windows\\System32\\notepad.exe",NULL,NULL,SW_SHOWNORMAL);

    看看结果,和前面效果差不多。



    源代码稍后上传。

    展开全文
  • 根据系统位数选择不同pchunter即32位或64位,我开始随便下载的pchunter,打开没有进程显示,后来下载了64位的打开有显示,这时找到结束不了进程,然后 右键--查看进程线程 ,然后将所有的线程给杀光光,再出来到进程...
  • 关闭win7结束不了得进程

    千次阅读 2018-10-16 10:37:13
    5、输入“Tskill+进程名”,即可结束进程。 6、这样就可以结束任务管理器无法结束的进程。 7、记住,只要输入进程名,不用输入扩展名。 8、不要关闭System、SMSS.EXE和CSRSS.EXE进程。   结束拒绝访问的...
  • case IDC_END: GetExitCodeProcess(pro_info.hProcess,&exitCode); TerminateProcess(pro_info.hProcess,exitCode); CloseHandle(pro_info.hThread); CloseHandle(pro_info.hProcess);...
  • win32进程间通信——共享内存

    万次阅读 2013-02-06 10:08:34
    WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换.  进程间通讯(即:同机通讯)和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、...
  • 根据系统位数选择不同pchunter即32位或64位,我开始随便下载的pchunter,打开没有进程显示,后来下载了64位的打开有显示,这时找到结束不了进程,然后 右键--查看进程线程 ,然后将所有的线程给杀光光,再出来到进程...
  • WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换。 进程间通讯(即:同机通讯)和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、...
  • 进程初学——使用win32API创建进程

    千次阅读 2015-10-14 20:58:49
    Windows中使用CreateProcess Function 创建进程
  • Win64 驱动内核编程-26.强制结束进程

    千次阅读 2017-03-29 00:37:32
    强制结束进程  依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情。同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品。作为学习和破解的话当然可以尝试各种hook。...
  • win32进程共享内存

    千次阅读 2014-07-03 16:00:34
    WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换.  进程间通讯(即:同机通讯)和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、...
  •  hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  bRet = Process32First(hProcess, &prry);  while (bRet)  {  memset(pmbbuf, 0, 260);  swprintf_s(pmbbuf, 260, L"%s", prry....
  • 如果查看8080端口是否被占用: netstat -ano | findstr "8080" 如果1668被占用了。...win7下强制结束进程命令 命令:tasklist  作用:显示当前正在运行的任务 命令:taskkill  作用:结
  • 最近遇到一个小问题,我需要在一个服务进程中去启动一个用户GUI进程。按常理来说这很简单,通常情况下调用ShellExecute这个API即可。这种方法在XP的年代似乎是完美的,但由于现在大多已经到了Win7,这个方法似乎已经...
  • VC(win32)通过进程名杀死进程

    千次阅读 2017-08-07 15:09:59
    #include "TlHelp32.h" void CKillProcessDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 //OnOK(); UpdateData(TRUE); CString str; str.Format(TEXT("确定要杀死进程:%s?"),m_ProcessName....
  • 探讨Win32应用进程间数据通讯技术

    千次阅读 2005-06-11 20:39:00
    多任务机制确实使PC 的世界变得更加丰富多彩,但是同时也带给我们程序员许多技术难题,如本文将来探讨的主题――Win32应用进程间数据通讯问题,就是这些技术难题中的比较典型的一种。二、 问题的提出Win32为提高
  • Win32进程间通信

    千次阅读 2007-12-05 19:45:00
    WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同在WIN16中对本地进程进行读写操作一样。 典型的WIN16两进程可以通过共享内存来进行数据交换:...
  • WIN32进程快照以及进程ID和句柄查找

    千次阅读 2012-12-19 22:41:51
    要对进程进行某种操作,就必须首先知道该进程进程句柄或者进程ID...Win32中并没有直接获取其他进程句柄的函数,但如果知道进程ID,可以由此得到进程句柄,所以可以首先通过某种途径获取进程ID。   一、获取进程ID
  • win ce中如何结束进程

    千次阅读 2009-01-04 17:08:00
    要求在一个进程结束另一个进程如何关闭系统内的任意进程! HWND hWnd; // 先得到想要关闭的窗口的句柄 // 比如用FindWindow hWnd=FindWindow(NULL,_T("dlg")); if ( hWnd ==NULL ) return ; // ...
  • 要对进程进行某种操作,就必须首先知道该进程进程句柄或者...Win32中并没有直接获取其他进程句柄的函数,但如果知道进程ID,可以由此得到进程句柄,所以可以首先通过某种途径获取进程ID。   一、获取进程ID  
  • ring0启动一个Win32进程

    千次阅读 2012-07-13 11:22:39
    在许多不成功的尝试来试图找到一种方式来以核心模式(KernelMode)来启动可运行的Win32进程后,我最终意外的发现了一段有希望的代码,这些代码既有独创性又有革新性(注意:这种想法来源于Valerino) 不幸的是,那些...
  • Win32 进程间通信的分析与比较

    千次阅读 2009-08-07 00:59:00
    Win32 进程间通信的分析与比较 1 进程进程通信 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线 程是Windows操作系统的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,306
精华内容 26,122
关键字:

win32结束进程