草庐IT

c++ - TerminateProcess 上的 ERROR_INVALID_HANDLE (VS C++)

coder 2023-11-11 原文

免责声明:这是程序要求的一部分,因此没有任何不良意义。如果您发现任何误用,请随时指出。我是 C++ 的初学者。

基本上,我正在尝试使用 C++ 在 Windows 上重新启动 Outlook.exe

这是我用来重启 Outlook 的代码。

#include <TlHelp32.h>
void RestartOutlook() {
    PROCESSENTRY32 Pc = { sizeof(PROCESSENTRY32) };
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);

    MODULEENTRY32 Mo = {sizeof (MODULEENTRY32) };

    if(Process32First(hSnapshot, &Pc)){
        do{
            if(!_stricmp(Pc.szExeFile, "outlook.exe")) {
                DWORD pid = Pc.th32ProcessID;

                HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);

                //kill outlook
                HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
                DWORD fdwExit = 0;
                GetExitCodeProcess(process, &fdwExit);
                TerminateProcess(process, fdwExit);

                char * path;
                if (Module32First(hModuleSnapshot, &Mo)) {
                    path = Mo.szExePath;

                    STARTUPINFO si;
                    PROCESS_INFORMATION pi;
                    ZeroMemory(&si, sizeof(si));
                    si.cb = sizeof (si);
                    CreateProcess(path, NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS,
                        NULL, NULL, &si, &pi);
                }


            }
        }while(Process32Next(hSnapshot, &Pc));
    }
}

有趣的是,这段代码在 Windows 7 上运行得非常好。而在 Windows XP (SP3) 上,我得到了重复的 Outlook。 GetLastError 给我 6: ERROR_INVALID_HANDLE。经过数小时的研究,我真的一无所知。

有什么想法吗?

反正C++不是我的专业。我做网络 :)

上面的代码是以下来源的混合:

1: http://www.istorya.net/forums/programming/107435-how-can-i-kill-a-process-using-c.html

2: http://code.activestate.com/recipes/576362-list-system-process-and-process-information-on-win/

环境:Windows 7、Windows XP、VS2010、Outlook 2003、Outlook 2007、Outlook 2010

最佳答案

我找到了罪魁祸首。

原因就在这一行:

HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);

根据 http://msdn.microsoft.com/en-us/library/ms684880(v=vs.85).aspx , PROCESS_ALL_ACCESS 对于Windows XP/NT系统来说太大了,或者更多细节:

The size of the PROCESS_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP/2000, the PROCESS_ALL_ACCESS flag is too large and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation.

肯定是我在 7 上编译这个程序,而在 XP 上运行肯定会导致问题。

所以解决方案是,将 PROCESS_ALL_ACCESS 更改为 PROCESS_TERMINATE,这

HANDLE process = OpenProcess(PROCESS_TERMINATE, TRUE, pid);

完成!

感谢@DReJ 的快速回复:)

关于c++ - TerminateProcess 上的 ERROR_INVALID_HANDLE (VS C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690472/

有关c++ - TerminateProcess 上的 ERROR_INVALID_HANDLE (VS C++)的更多相关文章

  1. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  7. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

随机推荐