2012-06-19 181 views
0

我有一個函數,它讀取一個註冊表項,爲其中的程序獲取路徑,並將此路徑作爲第二個參數調用CreateProcessA。調試應用程序,它失敗,說沒有找到該文件。將路徑傳遞給CreateProcessA

a)是,該文件存在 b)是,我有機會來執行這個文件

問題:實際讀取了reg關鍵,並給予路徑CreateProcessA的功能,不逃避的路徑:這意味着,CreateProcessA收到一個字符串,如「C:\ Program Files \ prog.exe」,而不是像「C:\\ Program Files \\ prog.exe」。這是問題嗎?是否存在任何Windows函數以自動轉義所有反斜槓?

+1

像「C:\ Program Files \ prog.exe」,而不是像「C:\ Program Files \ prog.exe」?他們是一樣的。 – rasmus

+0

@rasmus stackoverflow過濾了兩個反斜槓。我不得不逃脫它:) –

+0

三種可能性:1)您的代碼被破壞,2)註冊表鍵不正確,或3)文件根本不存在。沒有代碼也沒有數據,任何人都無法猜測它是什麼。 –

回答

0

常見錯誤包括未指定的路徑的可執行作爲第一個參數給CreateProcess,而不是引述路徑的可執行在第二個參數

CreateProcess(<exe path goes here> , <quoted exe path plus parameters goes here>, ...); 

像這樣:

std::wstring executable_string(_T("c:\\program files\\myprogram\\executable.exe")); 
std::wstring parameters(_T("-param1 -param2")); 

wchar_t path[MAX_PATH+3]; 
PathCanonicalize(path, executable_string.c_str()); 
path[sizeof(path)/sizeof(path[0]) - 1] = _T('\0'); 

// Make sure that the exe is specified without quotes. 
PathUnquoteSpaces(path); 
const std::wstring exe = path; 

// Make sure that the cmdLine specifies the path to the executable using 
// quotes if necessary. 
PathQuoteSpaces(path); 
std::wstring cmdLine = path + std::wstring(_T(" ")) + parameters; 

BOOL res = CreateProcess(
       exe.c_str(), 
       const_cast<wchar_t *>(cmdLine.c_str()), 
       ...); 

我只是複製和修改了一些,所以上面可能會有一些錯誤,但是這個想法就在那裏。確保在第一個參數中使用沒有引號的路徑,並在第二個引號中使用路徑,你應該沒問題。

+0

ok,但是我看到你正在使用Unicode。正如我指定的,我使用的是Ansi版本的CreateProcessA。我的問題是:我正在從註冊表中讀取路徑。該路徑沒有「\\」而是「\」。我應該逃避反斜槓嗎? –

+2

@VP:你不需要轉義你從註冊表中讀取的反斜槓。這個例子中的「\\」是C編譯器需要的,它能夠將一個\放在一個字符串中。傳遞給CreateProcessA()的字符串是'c:\ program files \ myprogram \ executable.exe' – tinman

+0

@VP:tinman在這裏是100%正確的。除了1.你需要在上面的例子中使用std :: string,2.你將不能使用其中包含非ansi字符的路徑,3。我想你可能會在沒有常規演員的情況下離開。 – villintehaspam