将字符串转换为 TCHAR*?

问题描述 投票:0回答:1

我正在尝试使用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*
类型的正确方法是什么?

感谢您阅读我的帖子,感谢任何指导。

c++ string winapi
1个回答
1
投票

需要一些研究和经验才能了解 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 和字符串处理的用途的足够详细的文章中引用。不幸的是,这是一次痛苦的学习经历。

© www.soinside.com 2019 - 2024. All rights reserved.