簡體   English   中英

從 Windows 命令提示符與從 Windows Explorer 運行可執行文件有什么區別?

[英]What are the differences between running an executable from a Windows Command Prompt versus from Windows Explorer?

編輯:這是由於愚蠢。 這是一個多顯示器問題。 只是從 cmd.exe 我們總是在主監視器中打開,而從資源管理器中,我們總是在輔助監視器中打開。 感謝大家的幫助!

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

我們懷疑環境變量,因為這就是我們所能想到的。 但它使用一行批處理文件運行良好的事實似乎反駁了這一點。 我對 windows 不夠熟悉,不知道它如何加載可執行文件的任何細微差別,也不知道在哪里可以找到。

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

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

從 cmd.exe 運行相同的可執行文件時遇到的行為(或通過雙擊 .exe 旁邊的僅包含一行來運行 .exe 的 .bat 文件)是正確的預期行為:場景正確,沒有閃爍, ETC。

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

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

有關點本地重定向的更多詳細信息,例如.

該線程看起來可能會回答您的問題:

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

簡而言之,我認為它可能會根據您嘗試使用哪種方法運行它,在不同的地方尋找您的可執行文件。 也許您有 2 個不同的版本隱藏在資源管理器使用的某個地方,而不是您想要的那個?

你沒有提供足夠的細節,所以我會給你一個籠統的答案。 為了使用 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 文件。

我希望這有幫助。

也許資源管理器啟動可執行文件的方式與直接從控制台運行它的方式有所不同。 我認為資源管理器使用ShellExecuteShellExecuteEx ,我懷疑從控制台或批處理文件執行應用程序是否相同。

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

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

我還將調查AppCompatFlags是否影響控制台執行的應用程序(或查看是否為您的應用程序設置了任何 AppCompatFlags)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM