我正在尝试使用函数SHGetKnownFolderPath()来获取用户本地应用程序数据的目录,并将PWSTR(即wchar_t *)转换为LPCSTR(即const char *),然后将程序添加到LPCSTR以便可以在CreateProcess中使用。
我想出了如何使用SHGetKnownFolderPath并使用printf(%ls%,path)打印到控制台的路径,并且想出了如何使用CreateProcess执行.exe文件,但是我不知道如何使PWSTR成为const char *,并将要执行的程序包含在const char *中。
#include <Windows.h>
#include <fstream>
#include <shlobj_core.h>
#include <string>
#include <KnownFolders.h>
#include <wchar.h>
int main () {
//SHGetKnownFolderPath function
PWSTR path = NULL;
HRESULT path_here = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path);
//CreateProcess funtion
STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
const char* execute = //Want to have path_here plus another folder and an .exe program.
BOOL create = CreateProcess(execute, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo);
.......................
}
我不会说我对编码了解很多,可能还有一些我不知道的重要知识。任何帮助将不胜感激。
编辑
我认为,如果我展示代码的另一部分会更有用。下面的代码就在我上面编写的代码之后:
if (create){
WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
}
答案 0 :(得分:1)
完全不转换为char
。 SHGetKnownFolderPath()
返回Unicode字符串。显式使用CreateProcessW()
,以便为它传递Unicode字符串:
#include <Windows.h>
#include <fstream>
#include <shlobj_core.h>
#include <string>
#include <KnownFolders.h>
#include <wchar.h>
int main ()
{
PWSTR path = NULL;
HRESULT hres = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path);
if (SUCCEEDED(hres))
{
STARTUPINFOW info = { sizeof(STARTUPINFOW) };
PROCESS_INFORMATION processInfo;
std::wstring execute = std::wstring(path) + L"\\folder\\program.exe";
CoTaskMemFree(path);
BOOL create = CreateProcessW(&execute[0], NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo);
// ...
}
return 0;
}