2011-06-29 31 views
1

編輯:這是由於愚蠢。這是一個多監視器問題。只是從cmd.exe開始,我們總是在主監視器中打開,而從資源管理器中,我們總是打開第二個監視器。感謝所有的幫助!從Windows命令提示符與Windows資源管理器運行可執行文件有什麼區別?

最近我們遇到了一個奇怪的錯誤。我們有一個Qt + osg應用程序,如果我們從資源管理器運行它,它的行爲就會與從命令行運行它不同。從資源管理器運行是不可用的,而從命令行運行(或通過從資源管理器運行一個調用.exe的簡單批處理文件)按預期工作。

我們懷疑環境變量,因爲這是我們所能想到的。但事實證明,它與一行批處理文件運行良好似乎駁斥了這一點。我對Windows不夠熟悉,不知道它如何加載可執行文件以及在哪裏查找。

有沒有其他的差異可以解釋這一點? Windows在每種情況下是否加載不同的用戶環境變量集?操作系統是Windows XP Service Pack 3.

從資源管理器(雙擊program.exe)運行時遇到的行爲與驅動程序問題或不正確的OSG場景設置一致:圖像工件,閃爍和奇怪的顏色。

從cmd.exe運行同一個可執行文件時(或通過雙擊包含僅用於運行.exe的一行的.exe文件的.bat文件)的行爲是正確的,預期的行爲:場景是正確,無頻閃等

+0

「無法使用」的意思是什麼?行爲有什麼不同? –

+0

我可以認爲,從Windows資源管理器運行,標準輸出和標準輸入將不同於從控制檯運行。 –

+0

osg查看器不能正確再現場景。它有文物和顏色黯然失色。基本上,你期望的驅動程序問題。但是,如果程序運行在exe旁邊的雙擊批處理文件中,程序工作正常。 – Thadeux

回答

1

要排除潛在的庫加載路徑問題,請嘗試使用點本地DLL重定向。

爲此目的,在與您的可執行文件相同的目錄中創建一個(空)文件,併爲其添加與您的二進制文件相同的名稱,但附加.local除外。即,如果您的二進制文件名爲yourbinary.exe,請將該文件命名爲yourbinary.exe.local。這將迫使PE加載器首先查看該目錄以解析LoadLibrary調用(包括通過系統DLL或COM間接加載的DLL,不管涉及多少間接級別)。放置許多支持DLL(包括Qt DLL)在那個目錄中。如果你是使用Qt的插件,也放置plugins目錄下有(或使用自定義trolltech.conf。)

更多細節上點本地重定向here, for example

+0

這有助於找到我們的愚蠢最多。 – Thadeux

0

這個線程看起來似乎有回答你的問題:

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

總之,我認爲它可能會尋求在根據不同的地方你的可執行文件您嘗試使用哪種方法來運行它。也許你有兩個不同的版本隱藏在那個瀏覽器使用的地方而不是你想要的地方?

+0

有很多頭部劃傷,確保我們運行的可執行文件是相同的,然後更多的頭部劃傷。看起來好像在任何情況下Windows如何加載可執行文件都有一些區別。我希望有一種方法來強制資源管理器從該線程中的命令提示符下載exe,但我沒有找到它...... – Thadeux

0

你沒有給出足夠的細節,所以我會給你一個一般的答案。爲了使用QT及其工具,您需要2個環境變量。 * QTDIR和PATH *確保你有這些變量設置說明如下。我已將他們從this網站中帶走。另請參閱this鏈接以在Windows上部署。

設置QTDIR環境 變量。

1)創建一個新的系統變量 稱爲:QTDIR a。右鍵單擊我的電腦 - >屬性 - >高級選項卡 - > 環境變量按鈕 b。查找系統變量 - >新建 - >輸入「QTDIR」2)將值設置爲:C:\ your \ Qt \目錄(注意:沒有 尾隨'\'字符!!!)

現在,添加QTDIR到您的PATH 變量。

1)編輯你的PATH變量,加上 它的結尾';'如果不是 已經結束。2)現在添加: %QTDIR%\ bin;

實施例:

之前 PATH =%SYSTEMROOT%\ SYSTEM32;%SYSTEMROOT%;%SYSTEMROOT%\ System32下\ WBEM; 之後, PATH =%SystemRoot%\ system32;%SystemRoot%;%SystemRoot%\ System32 \ Wbem;%QTDIR%\ bin;

這將確保我們的Qt應用 (S)將能夠找到 Qt的DLL文件,當您去跑 它。

我希望這會有所幫助。

+0

所需的二進制文件位於同一目錄中的可執行文件旁邊。所有的Qt和Osg的。在這兩種情況下,環境變量之間可能會有一些混淆,導致不同版本的dll被使用,但這意味着Windows在從資源管理器加載和從cmd.exe加載之間使用不同的環境變量集。 :/ – Thadeux

+1

嗯,它的確如此。一個進程通常會繼承父進程的環境。你有不同的父母。如果您在命令行中使用了SET命令,那麼這不會影響Explorer的環境。 –

0

也許由於Explorer啓動可執行文件的方式與直接從控制檯運行它有所不同。我認爲資源管理器使用ShellExecuteShellExecuteEx,我懷疑從控制檯或批處理文件執行應用程序是否一樣。

我會創建一個測試應用程序,它會嘗試一些ShellExecute變體並使用不同的參數來查看是否可以複製Explorer行爲,以便嘗試診斷傳遞給ShellExecute的參數可能導致問題。

有是的ShellExecuteEx頁面,可能會或可能不適用於一個有趣的社區注: ShellExecuteEx ignores the current input desktop. It always uses winsta0\default. Instead use ShellExecute or CreateProcess.

我也將調查AppCompatFlags是否不會影響控制檯執行的應用程序(或者看看是否有任何AppCompatFlags已爲你的申請)。

相關問題