我们最近遇到了一个奇怪的错误。我们有一个Qt + osg应用程序,如果我们从资源管理器运行它的行为不同,那么我们从命令行运行它。从资源管理器运行是不可用的,而从命令行运行(或从资源管理器运行一个调用.exe的简单批处理文件)按预期工作。
我们怀疑环境变量,因为这是我们所能想到的。但它使用单行批处理文件运行正常的事实似乎驳斥了这一点。我不熟悉windows,知道它如何加载可执行文件的细微差别,也不知道在哪里查找。
还有其他差异可以解释这个吗? Windows是否在每种情况下加载不同的用户环境变量集?操作系统是Windows XP Service Pack 3。
从资源管理器(双击program.exe)运行时遇到的行为与驱动程序问题或不正确的OSG场景设置一致:图像瑕疵,闪烁和奇怪的颜色。
从cmd.exe运行相同的可执行文件时遇到的行为(或通过双击.exe文件旁边的.bat文件只包含一行来运行.exe)是正确的,预期的行为:场景是正确的,没有闪烁等等。
答案 0 :(得分:1)
要排除潜在的库加载路径问题,请尝试使用点本地DLL重定向。
为此,在与可执行文件相同的目录中创建一个(空)文件,并为其指定与二进制文件相同的名称,但附加.local
除外。即,如果您的二进制文件名为yourbinary.exe
,则将该文件命名为yourbinary.exe.local
。这将迫使PE加载器首先查看该目录以解析LoadLibrary调用(并且包括通过系统DLL或通过COM间接加载的DLL,无论涉及多少间接级别。)放置尽可能多的支持DLL(包括Qt DLL)在那个目录中。如果您使用的是Qt插件,请将plugins
目录放在那里(或使用自定义trolltech.conf
。)
有关点局部重定向的更多详细信息here, for example。
答案 1 :(得分:0)
这个帖子看起来可能有你问题的答案:
http://forum.soft32.com/windows/Start-Run-Command-Prompt-ftopict353085.html
简而言之,我认为它可能会在不同的地方寻找您的可执行文件,具体取决于您尝试使用哪种方法来运行它。也许你有2个不同的版本隐藏在探险家使用的地方而不是你想要的那个?
答案 2 :(得分:0)
你没有提供足够的细节,所以我会给你一个通用答案。要使用QT及其工具,您需要2个环境变量。 * QTDIR和PATH * 确保您有以下变量设置说明。我从this网站上取走了它们。另请参阅this链接以在Windows上进行部署。
设置QTDIR环境 变量
1)创建一个新的System变量 叫:QTDIR 一个。右键单击我的电脑 - >属性 - >高级选项卡 - > 环境变量按钮 湾查找系统变量 - >新 - >键入“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文件 它
我希望这会有所帮助。
答案 3 :(得分:0)
资源管理器启动可执行文件与直接从控制台运行它的方式可能会产生差异。我认为资源管理器使用ShellExecute或ShellExecuteEx,我怀疑从控制台或批处理文件执行应用程序是否也一样。
我会创建一个测试应用程序,尝试一些ShellExecute变体并使用不同的参数来查看是否可以重现Explorer行为,以便尝试诊断传递给ShellExecute的参数可能导致问题。
ShellExecuteEx页面上有一个有趣的社区注释,可能适用也可能不适用:
ShellExecuteEx ignores the current input desktop. It always uses winsta0\default. Instead use ShellExecute or CreateProcess.
我还会调查AppCompatFlags是否影响控制台执行的应用程序(或查看是否为您的应用程序设置了任何AppCompatFlags)。