2012-07-12 68 views
2

我試圖使用CreateProcess爲了運行位於用戶的Program Files目錄中的文件,所以我試圖使用CSIDL_PROGRAM_FILESX86,因爲該特定的程序將始終在(x86)文件夾。程序文件中的文件的C++創建過程

我的問題是,我不能讓它開始工作,由於某種原因,我無法找到如何使用createprocessCSIDL_PROGRAM_FILESX86

你能告訴我這樣的例子任何的例子嗎?也許我應該使用不同的功能?

編輯

這是我當前的代碼:

wchar_t* localAppData = 0; 
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, 0, NULL, &localAppData); 

wstringstream ss; 
ss << localAppData << L"/MyApp/MyExe.exe"; 

CreateProcess(static_cast<void*>(localAppData)); 

我得到這個爲德SHGetFolderPath

cannot convert parameter 5 from wchar_t ** to LPWSTR

而且,即使我包括sstream在標題中,我得到這些錯誤:

'wstringstream' : undeclared identifier

注:我使用的SHGetFolderPath,因爲我需要這在XP和工作Vista/7的

任何想法?

+0

C++並不那麼複雜。 #include 並且不推薦使用std :: wstringstream – nurettin 2012-07-12 13:09:12

回答

0

的問題是,你需要爲Windows API的C風格的字符串處理:

wchar_t localAppData[MAX_PATH]; // Array, not a pointer. 
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, 0, NULL, localAppData); 

std::wstringstream ss; 
ss << localAppData << L"/MyApp/MyExe.exe"; 

CreateProcess(ss.str().c_str(), ...); 

而且,請注意,只有CSIDL_PROGRAM_FILESSHGetFolderPath支持。

+0

This Works,thanks!有什麼方法可以使用CSIDL_PROGRAM_FILES或其他任何可以讓代碼在所有Win XP/7/Vista上運行的變量? – user838437 2012-07-15 12:49:57

+0

CSIDL_PROGRAM_FILES雖然不推薦使用,但仍適用於所有Windows版本。 – MSalters 2012-07-16 06:08:31

0

在winapi文檔中有一個SHGetSpecialFolderPath,這可能會有所幫助。

編輯:

似乎是一個被棄用,因此,使用SHGetFolderPath代替。根據編輯

評論:

使用SHGetKnownFolderPath,如果你是在Vista及以上。

編輯:Example stackoverflow code

只需更換用的CreateProcess的CoTaskMemFree。

+0

。看來,使用的功能是http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx – steffen 2012-07-12 07:44:42

+0

@steffen它不被棄用,你的功能doesn在xp上不存在。 – nurettin 2012-07-12 07:48:50

+0

也被棄用。看來,使用的功能是http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx – steffen 2012-07-12 07:49:31