20

你这样做AssignProcessToJobObject了,它会因“拒绝访问”而失败,但只有在你在调试器中运行时才会失败。为什么是这样?

4

2 回答 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>

其次(这是我坚持的一点),当您在调试器下运行应用程序时,它会在作业对象中创建您的进程。在您将其分配给您的工作之前,您的子进程需要能够脱离哪个。所以(duh),您需要 CREATE_BREAKAWAY_FROM_JOB在标志中指定CreateProcess)。

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

于 2008-09-18T02:52:38.640 回答
5

这似乎经常咬我,虽然很好,但 1800INFORMATION 的帖子似乎没有包含许多似乎有帮助的原因和修复,所以似乎值得发布我看到这种情况发生的原因的摘要。

  1. 在尝试自己解决此问题时,请注意,从 CMD.EXE、资源管理器和 Visual Studio 运行时,可能会出于不同原因出现此问题。尝试从各个位置运行失败的可执行文件有助于确定问题的原因。尽管 VS 和 Explorer.exe 失败,但您的应用程序可能只能从 CMD.EXE 中找到
  2. 就我而言,在 Win7 下,我似乎需要取消注释 app.manifest 文件中指示 Win7 兼容性的“supportedOS”元素。这似乎解决了从资源管理器运行时的问题。要添加清单,请右键单击项目,点击添加,然后找到“应用程序清单文件”。
  3. 为了让 Visual Studio 2010 正常工作,我似乎需要阻止它使用程序兼容性助手,Tom Minka 在这里分享了两种方法:https ://stackoverflow.com/a/4232259/86375 ,注意,我必须重新启动 VS2010 以接受他建议的更改。
于 2012-02-08T20:32:03.730 回答