在调试器下运行时,使用AssignProcessToJobObject会出现“访问被拒绝”的错误。

20

您使用AssignProcessToJobObject,但在调试器运行时出现“访问被拒绝”的错误。为什么会这样?

2个回答

22

这个问题困扰了我大约30分钟。

首先,你可能需要在你的应用程序中嵌入UAC清单(如此处所建议的)。像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <!-- Identify the application security requirements. -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
        <requestedPrivileges>
          <requestedExecutionLevel
            level="asInvoker"
            uiAccess="false"/>
        </requestedPrivileges>
      </security>
    </trustInfo>
  </assembly>

其次(这也是我遇到的问题),当您在调试器下运行应用程序时,它会在作业对象中创建您的进程。在将子进程分配给您的作业之前,您需要使其能够从该作业中脱离出来。因此,您需要在CreateProcess的标志中指定CREATE_BREAKAWAY_FROM_JOB

如果您没有在调试器下运行,或者您的父进程已经在作业中,则不会发生这种情况。


6

这个问题似乎经常困扰我,虽然1800INFORMATION的文章很好,但它似乎没有包括一些有用的原因和解决方法,所以值得发表一份总结,说明我为什么会遇到这个问题。

  1. 在尝试为自己解决此问题时,请注意,在从CMD.EXE、Explorer和Visual Studio运行时,此问题可能会出于不同的原因而发生。尝试从相应的位置运行失败的可执行文件可以帮助确定问题的原因。你的应用程序可能在CMD.EXE中能够正常工作,却无法从V.S.和Explorer.exe中正常运行。
  2. 在我的情况下,在Win7下,我似乎需要取消注释"supportedOS"元素,表示应用程序与Win7兼容,从而解决了在Explorer中运行时的问题。要添加一个清单,请右键单击项目,选择添加,然后找到'Application Manifest File'。
  3. 为了让Visual Studio 2010正常工作,我似乎需要阻止它使用程序兼容性助手,Tom Minka在这里分享了两种方法:https://dev59.com/BHVD5IYBdhLWcg3wGXlI#4232259。请注意,我必须重新启动VS2010才能采取他建议的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接