2

有一个应用程序可以在Windows 2008下正常启动,我们称之为App1。

当同一个应用程序由另一个应用程序(启动器)启动时,App1 在 secur32.dll 中崩溃。研究表明,这两种情况的环境不同。

当应用程序崩溃时,它的环境有一个额外的变量__COMPAT_LAYER=ElevateCreateProcess。

在全局系统级别设置 __COMPAT_LAYER=asInvoker 并不能解决问题。将 App1 和 Launcher 添加到 HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 的注册表也不能解决它。

两个程序在其清单中都有以下权限:requestExecutionLevel level="asInvoker" uiAccess="false"

UAC 已关闭。Windows 更新是最新的。唯一有帮助的解决方案是在两者之间注入另一个程序,以清除 __COMPAT_LAYER 或将其设置为 asInvoker。

什么可能是 ElevateCreateProcess 的原因以及如何避免它?谢谢你。

4

2 回答 2

1

此行为的原因可能是您的 Launcher 进程的命名。Windows 使用 ElevateCreateProcess 标志扩充与命名模式“*launch*.exe”匹配的每个进程。这种尴尬的行为是在 windows\apppatch\sysmain.sdb shim 数据库中指定的。您可以通过安装和运行应用程序兼容性工具包来查看这一点。在“系统数据库(32 位)/应用程序/自动运行”下,您可以找到此条目。尽管禁用也可能有风险,但在我的情况下,右键单击 -> 禁用条目也不起作用。

于 2016-07-01T10:01:59.010 回答
0

事实证明,在 dll 初始化期间调用 GetUserName 会提示问题,这会在 Vista 上崩溃。相关帖子是https://groups.google.com/group/microsoft.public.win32.programmer.kernel/browse_thread/thread/ae1b1e4ecbb6b123/1e9fefd4c8b12452

于 2012-02-15T16:06:10.230 回答