1

编辑:这是由于愚蠢。这是一个多显示器问题。只是从 cmd.exe 我们总是在主监视器中打开,而从资源管理器中,我们总是在辅助监视器中打开。感谢大家的帮助!

我们最近遇到了一个奇怪的错误。我们有一个 Qt + osg 应用程序,如果我们从资源管理器运行它的行为与从命令行运行它的行为不同。从资源管理器运行是不可用的,而从命令行运行(或通过从资源管理器运行一个调用 .exe 的简单批处理文件)按预期工作。

我们怀疑环境变量,因为这就是我们所能想到的。但它使用一行批处理文件运行良好的事实似乎反驳了这一点。我对 Windows 不够熟悉,不知道它如何加载可执行文件的任何细微差异,也不知道在哪里可以找到。

还有其他差异可以解释这一点吗?Windows 是否在每种情况下加载不同的用户环境变量集?操作系统是 Windows XP Service Pack 3。

从资源管理器(双击 program.exe)运行时遇到的行为与驱动程序问题或不正确的 OSG 场景设置一致:图像伪影、闪烁和奇怪的颜色。

从 cmd.exe 运行相同的可执行文件(或双击 .exe 旁边的 .bat 文件,其中仅包含运行 .exe 的行)时遇到的行为是正确的预期行为:场景正确,没有闪烁, ETC。

4

4 回答 4

1

要排除潜在的库加载路径问题,请尝试使用点本地 DLL 重定向。

为此,在与可执行文件相同的目录中创建一个(空)文件,并将其命名为与二进制文件相同的名称,除了.local附加的。即,如果您的二进制文件名为yourbinary.exe,则将该文件命名为yourbinary.exe.local。这将迫使 PE 加载器首先查看该目录以解析 LoadLibrary 调用(包括通过系统 DLL 或通过 COM 间接加载的 DLL,无论涉及多少间接级别。)放置尽可能多的支持 DLL(包括 Qt DLL)在那个目录中。如果您使用的是 Qt 插件,请将plugins目录也放在那里(或使用自定义的trolltech.conf.)

有关点本地重定向的更多详细信息,例如.

于 2011-06-29T15:53:52.627 回答
0

该线程看起来可能会回答您的问题:

http://forum.soft32.com/windows/Start-Run-Command-Prompt-ftopict353085.html

简而言之,我认为它可能会根据您尝试使用哪种方法运行它,在不同的地方寻找您的可执行文件。也许您有 2 个不同的版本隐藏在资源管理器使用的某个地方,而不是您想要的那个?

于 2011-06-29T14:42:27.117 回答
0

你没有提供足够的细节,所以我会给你一个笼统的答案。为了使用 QT 及其工具,您需要 2 个环境变量。* QTDIR 和 PATH *确保您有这些变量设置说明如下。我已经从这个网站上拿走了它们。另请参阅链接以在 Windows 上进行部署。

设置 QTDIR 环境变量。

1) 创建一个名为:QTDIR 的新系统变量。右键单击我的电脑 -> 属性 -> 高级选项卡 -> 环境变量按钮 b。查找系统变量 -> 新建 -> 键入“QTDIR” 2) 将值设置为:C:\your\Qt\directory (注意:没有尾随 '\' 字符!!!)

现在,将 QTDIR 添加到您的 PATH 变量中。

1) 编辑您的 PATH 变量,在其末尾添加一个 ';' 如果还没有结束。2) 现在添加:%QTDIR%\bin;

例子:

之前 PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem; 之后,PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%QTDIR%\bin;

这将确保我们的 Qt 应用程序在您运行它时能够找到 Qt DLL 文件。

我希望这有帮助。

于 2011-06-29T14:49:40.650 回答
0

也许资源管理器启动可执行文件的方式与直接从控制台运行它的方式有所不同。我认为资源管理器使用ShellExecuteShellExecuteEx,我怀疑从控制台或批处理文件执行应用程序是否相同。

我将创建一个测试应用程序,尝试一些 ShellExecute 变体并使用不同的参数来查看是否可以重现 Explorer 行为,以便尝试诊断传递给 ShellExecute 的哪些参数可能导致问题。

ShellExecuteEx 页面上有一个有趣的社区注释,它可能适用也可能不适用: ShellExecuteEx ignores the current input desktop. It always uses winsta0\default. Instead use ShellExecute or CreateProcess.

我还将调查AppCompatFlags是否会影响控制台执行的应用程序(或查看是否为您的应用程序设置了任何 AppCompatFlags)。

于 2011-06-29T15:24:47.287 回答