我正在尝试使用C++函数
CreateProcessW
在Windows 10系统中生成另一个进程。
我首先根据微软页面上描述
CreateProcessW
函数的官方示例测试了以下示例代码:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain(int argc, TCHAR* argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
bool result = CreateProcess(NULL, argv[1], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (!result)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return;
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
上面的设置允许我通过命令提示符启动命令,以便子进程顺利执行。
但是,我希望能够发送存储在
std::string
或 const char*
类型的字符串变量中的子进程命令,而不是仅通过命令提示符向子进程提供命令。
我看到
CreateProcessW
函数接受其子进程的执行命令作为 LPWSTR
类型,据我所知,它似乎是 TCHAR
类型的字符串文字,它似乎定义了 t_wchar
字符类型。
简单地尝试输入
(LPWSTR)"test.exe"
或 (TCHAR*)"test.exe"
会导致 Access violation error
。
将
std::string
或 const char*
类型转换为 LPWSTR
或 TCHAR*
类型的正确方法是什么?
感谢您阅读我的帖子,感谢任何指导。
需要一些研究和经验才能了解 TCHAR 及其与“char”和“wchar_t”(以及您在处理字符串时遇到的所有 MSFT 缩写词,如 LPCTSTR、LPWSTR 等)的关系。然而,尚不清楚为什么需要将字符串处理为基于“char”的字符串。也许你有合理的理由,但我对此表示怀疑。现代 Windows(至少在过去 25 年以上基本上是任何东西)都依赖 UTF-16 在内部处理字符串。简而言之,如果您在 WinAPI 中调用函数的 ANSI 版本(以“A”结尾的函数,例如“CreateProcessA”),操作系统实际上会在运行时调用“W”版本(例如“CreateProcessW()” ”)。因此,无论如何,基于“char”的字符串都将转换为基于“wchar_t”的字符串,这就是 UTF-16 字符串在 Windows 中的存储方式。以这种方式做事效率不高,通常不应该这样做(除非你确实有正当理由)。 MSFT 本身表示您通常不应该这样做。您通常也不应该将基于字符的字符串即时转换为基于“wchar_t”的字符串。通常,您首先应该依赖基于“wchar_t”的字符串,而不是 TCHAR 默认解析的字符串。 Google 查找 UNICODE 和 _UNICODE #define 常量,这些常量通常会在有关 WinAPI 中 TCHAR 和字符串处理的用途的足够详细的文章中引用。不幸的是,这是一次痛苦的学习经历。