2014-01-17 45 views
0

我只是試圖運行一個新的進程通過解析其位置通過PATH環境。變種。由於我使用Qt,這意味着我加入由PATH env啓動程序。變種。與正確的工作目錄

X:\文件夾\

到我的PATH變量,在我的首發申請我打電話

另外,QProcess :: startDetached( 「TEST.EXE」)

其實際工作。

但是,test.exe會將數據寫入其工作目錄。這些數據最終在starter應用程序的目錄中,而不是X:\ folder \,這不是我想要的。

我通過在CLI中鍵入「test.exe」直接在Windows命令行中測試了這種行爲,並且它在那裏是一樣的(將數據寫入當前目錄)。

有沒有一種方法(在C++或命令行中)使用PATH啓動進程,同時使用PATH中的目錄作爲新進程的工作目錄?

我可以爲自己搜索PATH,分析發現並通過另一個QProcess :: startDetached()重載啓動程序,但我想知道是否有更簡單的方法。

+0

也許去輸出目錄,並從那裏啓動 –

回答

0

沒有複雜的配置至少有3個選項。

1 - 從您的呼叫應用程序更改當前目錄到您的test.exe程序所在的位置。這樣,文件將轉到所需的目錄。但是,有可能呼叫應用程序會產生問題或在不應該的地方生成輸出,因此需要呼叫應用程序中當前目錄的新改變。

2 - 作爲參數傳遞到您的test.exe,它應該生成它的位置文件。

3 - 從您的test.exe確定它所在的位置,並使用此信息更改此過程的當前目錄,或者知道路徑,在它所在的同一目錄中生成文件。

TCHAR szPath[MAX_PATH]; 

if(!GetModuleFileName(NULL, szPath, MAX_PATH)) { 
    // handle error in GetModuleFileName 
} else { 
    // now, szPath contains file path 
}; 

這是檢索當前進程位置的標準windows方式。參考here: GetModuleFileName

+0

1和2意味着分析PATH env。變種。由我自己的,因爲初學者應用程序不知道(也不應該知道)有關test.exe位置(這是我使用PATH的原因)。 3是一個有趣的想法。使用Qt函數很容易。該解決方案的唯一缺點是,它還會在從VC++ IDE啓動應用程序時更改存儲位置,從而有效地爲每個目標(例如在調試/發佈子文件夾中)而不是一個日誌(在項目目錄中)創建單獨的日誌。 – Silicomancer

+0

@Silicomancer:那麼選擇去2/3。不,它不依賴於路徑分析。包括將路徑傳遞到存儲目錄的選項。如果沒有路徑通過(在生產中),請使用模塊路徑。在開發環境中,將項目屬性中的路徑參數作爲參數傳遞給指示項目目錄的程序。 –

+0

這是一個好主意。我想我會這樣做。謝謝! – Silicomancer

1

當您使用路徑時,操作系統將不會「移動到當前目錄」。你必須自己做。 (在大多數情況下,你並不希望應用程序移動到不同的目錄 - 如果編譯器在做這件事情時做了這些事情,那麼你必須將完整路徑傳遞給所有內容,因爲你肯定不會希望將源文件放在編譯器所在的位置 - 在許多情況下,您甚至可能無法在Unix/Linux系統上寫入該目錄)。

您必須預先安裝正確的文件夾[並且我建議使用應用程序安裝目錄可能不是最好的地方],或者執行chdir(...)將當前工作目錄更改爲您希望數據的位置。大多數應用程序(使用將文件存儲在特定位置的原理)將「默認目錄」存儲在某個設置中,因此用戶可以更改設置以適合他/她的設置。

+0

你是對的。在大多數情況下,這不是我們想要的。在我的情況下,這是一個寫入工作目錄的中央應用程序日誌,並將其存儲在應用程序的文件夾中將是一件好事。 所以如果現在有辦法,而不是爲我自己處理PATH,我會這樣做。 我也會考慮使用另一個目錄,但如果查找日誌文件,他/她可能會首先在應用程序的目錄中搜索。 – Silicomancer

相關問題