问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MFC下如何关闭外部程序,例如关闭一个以notepad.exe D:\\text.txt打开的进程

发布网友 发布时间:2022-04-11 22:37

我来回答

2个回答

热心网友 时间:2022-04-12 00:07

 STARTUPINFO si;
    PROCESS_INFORMATION pi;
    LPTSTR szCmdline=_tcsp(TEXT("notepad.exe D:\\text.txt"));
 
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
 
    // Start the child process.
    if( !CreateProcess( NULL,   // No mole name (use command line)
       szCmdline,      // Command line
       NULL,           // Process handle not inheritable
       NULL,           // Thread handle not inheritable
       FALSE,          // Set handle inheritance to FALSE
       0,              // No creation flags
       NULL,           // Use parent's environment block
       NULL,           // Use parent's starting directory
       &si,            // Pointer to STARTUPINFO structure
       &pi )           // Pointer to PROCESS_INFORMATION structure
       )
    {
       printf( "CreateProcess failed (%d).\n", GetLastError() );
       return;
    }
 
    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );
 
    // 这里就是关闭 
    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

CloseHandle( pi.hProcess );

    CloseHandle( pi.hThread );

后,子进程就与父进程彻底脱离关系了,在Windows下进程之间的关系比较弱,不仅没有父进程收割子进程退出状态这一回事,甚至连getppid这样的API也没有。这又导致了两个现象,

1)Windows下不用当心Linux下的僵死进程问题。


2.)当失去句柄仅仅知道进程ID时,Windows下甚至无法判断此进程是否就是原有进程,(用OpenProcess打开的句柄无法判定是否就是原来的进程)假如此进程已经结束,也无法获取到进程的退出状态。(在Windows下获取进程退出状态必须得保留进程的句柄,然后调用GetExitCodeProcess)


3.现在一般的游戏都已经不允许直接运行了,这点的目的很简单,加大别人用反编译软件调试游戏主程序的难度。按照CreateProcess的默认参数的直接创建原游戏主程序时,会碰到一个问题,及当发生原程序发生缺少动态库等情况时,原有系统弹出的提示对话框会被调用CreateProcess的进程吞掉,使得这类错误被掩盖,因为此时CreateProcess返回值实际是成功的。这时候,将CreateProcess的参数Process Creation Flags设为CREATE_DEFAULT_ERROR_MODE就可以让原有的提示窗口弹出来。


4. Process Creation Flags设为CREATE_SUSPENDED时,可以将欲创建进程挂起,这时想对新进程干啥都行,甚至可以尝试更改其代码段以影响程序运行,(但是大部分带监控的杀毒软件会有警告)。然后用ResumeThread API去让原进程的主线程运行起来。


5.CreateProcess创建的进程句柄实际代表的是一个Windows核心对象,适用于Windows核心对象的操作都可以对进程句柄进行,(核心对象的概念请参考《WIndows核心编程》,其中包括WaitForSingleObject等同步API。

追问是您原创的么,不明觉厉啊!

追答msdn都有的

热心网友 时间:2022-04-12 01:25

追问病毒?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
形容手表很舒服的句子 情侣手表的对话句子 租门面和房东鉴了十年合同,房东要退店面,我可以不退吗,继续经 ...一篇朝花夕拾里十篇小短文的主要内容及作者的情感和主要人物的... 什么叫狼狗 狼狗的生活习性有哪些? 起个姓罗好听的宝宝名字 野火的近义词 个是词语解释 请旌词语解释 怎么用c语言结束某进程? 易语言 用OpenProcess取进程句柄 TerminateProcess用进程句柄关闭了进程 还需要关闭进程句柄吗? 怎样关闭一个程序打开的其他进程 C++ 要关闭某个进程的函数是哪个 求教高手 如何用c++实现关闭某一进程中的一个句柄 vb怎样结束指定进程 C++怎样关闭一个已经名称的程序的进程? VB中如何根据窗口的句柄结束他的进程? MFC中,知道进程的名称了,怎么通过进程来关闭程序 【Delphi】请问如何根据句柄结束进程 一台电脑不同用户登录,可以有固定的不同ip设置吗 交换机怎么设置只允许ip地址为192.167.7.1的用户telnet登陆。 高分:asp如何实现一个IP一天内只允许一个帐号登陆,? 如何配置iptables,只允许本机访问一个ip 局域网 怎限制某一特定用户访问本机? asp中如何实现一用户id同时只允许一个用户登录 请问版主是不是同意IP地址只允许登陆一台电脑谢谢了,大神帮忙啊 在多ip地址的win2003中限制只能通过一个ip地址进行远程桌面登陆 网络登录账号被限制,只允许一个IP登陆,路由器不能使用,怎么才能设置路由器才能多台机器使用? php+mysql查询上万条数据很慢,其中把分页去掉就快了 已知一个进程的句柄,怎么判断该进程是否结束 在VB程序结束之前,关闭某进程 求教电脑高手如何获得进程句柄并且结束其中句柄,有没有什么软件。。 java中关闭某个程序的进程 cmd /c taskkill /pid 具体的某个pid 已知窗口句柄,是否可以凭该句柄关掉该窗口? Microsoft SQL Server系统安全性和Oracle系统安全性之间的异同? 怎样利用组来保证Oracle安全 为什么说oracle数据库比sqlserver好? Oracle里“sqlplus / nolog”是做什么的?什么意思? oracle 系统值集安全性,交叉验证规则数据访问权限的区别和用途 我可以继续向你请教SmartFoxServer的问题吗? nginx如何启用ngx_http_rewrite_module cisco路由器的ACL访问控制列表如何使用 cisco 访问控制列表 Cisco 路由器上设置访问控制列表 关于cisco访问控制列表的疑问 在思科三层交换机上怎麽用访问控制列表限制一个VLAN访问另一个VLAN? CISCO网络设备简单配置求助(访问控制列表) cisco路由器访问控制列表 Cisco Packet Tracer访问控制列表