2

我正在尝试使用CreateProcess以运行位于用户的 Program Files 目录中的文件,因此我正在尝试使用CSIDL_PROGRAM_FILESX86该特定程序,因为该特定程序将始终位于 (x86) 文件夹中。

我的问题是我无法让它工作,由于某种原因,我找不到任何关于如何使用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 上工作

有任何想法吗?

4

2 回答 2

0

The problem is the C style string handling that you need for the Windows API:

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(), ...);

Also, note that only CSIDL_PROGRAM_FILES is supported with SHGetFolderPath.

于 2012-07-12T17:53:18.537 回答
0

winapi 文档中有一个SHGetSpecialFolderPath ,也许它会有所帮助。

编辑:

似乎已弃用一个,因此请改用SHGetFolderPath

根据评论编辑:

如果您在 vista 及更高版本上,请使用SHGetKnownFolderPath 。

编辑:示例stackoverflow代码

您可以将 CoTaskMemFree 替换为 CreateProcess。

于 2012-07-12T07:20:23.580 回答