c++ - 在 CreateProcess 的路径中使用 SHGetKnownFolderPath 来运行程序
问题描述
我正在尝试使用函数 SHGetKnownFolderPath() 获取用户的 localappdata 的目录并将 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);
}
解决方案
根本不要转换为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;
}
推荐阅读
- java - JFX 图像未显示在网格窗格中
- django - 如何从 Django 框架连接到雪花数据库
- reactjs - React Native (Hooks) - 我如何“取消 useEffect 清理功能中的所有订阅和异步任务”?
- sql - 使用 SQLPL 时的情况
- python-3.x - virtualenv envname -p=python35 显示错误“找不到python35”
- gridview - 如果将 null 值作为参数传递给 Gridview 使用的 sqldatasource,则不会显示 Gridview
- node.js - 如何将样式应用于电子邮件正文中的表格?
- excel - 从一个工作簿剪切/粘贴到另一个工作簿
- reactjs - 并行处理的 Reactjs 加载时间
- vim - 当缓冲区在vim目录中时执行命令