如何组合两个 char_t* 字符串?

How do you combine two char_t* strings?

我想做的是在编辑子 window 中获取进程列表。我原本打算使用一系列带滚动条的按钮,但我不知道该怎么做(如果您有解决方案)并且没有找到相关资源。

我尝试了 wchar.h 个函数,然后输入转换。

HWND listProc = CreateWindow(L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL,
            0, 0, 100, 300, process, NULL, NULL, NULL);
        LPWSTR procList = L'';
        Process32First(procSnap, &procEntry);
        while (Process32Next(procSnap, &procEntry))
        {
            wcsncat(procList, procEntry.szExeFile, MAX_PATH);
            wcsncat(procList, L"\n", 1);
        }
        SetWindowText(listProc, procList);
        CloseHandle(procSnap);

首先,您的代码无法编译:

LPWSTR procList = L'';

不能用单个宽字符初始化指针。

其次,假设您打算将 procList 初始化为一个空字符串,您对 wcsncat 的调用将导致未定义的行为,因为该函数期望目的地指向足够的 space执行串联。它不会分配额外的内存。

我建议您完全不要使用 C 风格的字符串,而是使用 std::wstring。您可以使用 += 运算符连接其他字符串,并分配额外的内存 。您可以使用 c_str() 函数将字符串内容传递给 SetWindowText

  1. 如@jkb 所述,使用std::wstring;
  2. 使用std::stringstream。(或任何其他流class)

另外,你的样本还有其他问题。如果你不希望你的输出文本是一行并且难以阅读,你需要在你的编辑控件中添加 ES_MULTILINE | ES_AUTOVSCROLL 的 Exstyle,并且 使用 "\r\n" 来连接字符串换行。

1).示例:

   HWND listProc = CreateWindowEx(0, L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL| ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
       0, 0, 100, 300, hWnd, NULL, NULL, NULL);

   HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

   std::wstring procList;
   PROCESSENTRY32 procEntry;
   procEntry.dwSize = sizeof(PROCESSENTRY32);
   Process32First(procSnap, &procEntry);
   procList += procEntry.szExeFile;
   procList += L"\r\n";
   while (Process32Next(procSnap, &procEntry))
   {
       procList += procEntry.szExeFile;
       procList += L"\r\n";
   }
   SetWindowText(listProc, procList.c_str());
   CloseHandle(procSnap);

2).示例:

   HWND listProc = CreateWindowEx(0, L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL| ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
       0, 0, 100, 300, process, NULL, NULL, NULL);

   HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

   std::wstringstream procList;
   PROCESSENTRY32 procEntry;
   procEntry.dwSize = sizeof(PROCESSENTRY32);
   Process32First(procSnap, &procEntry);
   procList += procEntry.szExeFile;
   procList += L"\r\n";
   while (Process32Next(procSnap, &procEntry))
   {
       procList << procEntry.szExeFile;
       procList << L"\r\n";
   }

   SetWindowText(listProc, procList.str().c_str());
   CloseHandle(procSnap);