【问题标题】:How do you combine two char_t* strings?你如何组合两个 char_t* 字符串?
【发布时间】:2020-03-13 10:21:32
【问题描述】:

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

我尝试了 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);

【问题讨论】:

    标签: c++ winapi concatenation wchar


    【解决方案1】:

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

    LPWSTR procList = L'';
    

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

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

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

    【讨论】:

      【解决方案2】:
      1. 正如@jkb 提到的,使用std::wstring;
      2. 使用std::stringstream.(或任何其他流类)

      此外,您的样本还存在其他问题。如果您不希望输出文本为一行且难以阅读,则需要将ES_MULTILINE | ES_AUTOVSCROLL 的Exstyle 添加到您的编辑控件中,并使用"\r\n" 将字符串连接到Wrap text。强>

      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);
      

      【讨论】:

      • 谢谢。你设法回答了我的问题,然后用我的新问题读懂了我的想法。不确定哪个要标记为接受,所以我随机选择了一个。
      • 另外,您需要将while 循环更改为do/while,否则您将丢失有关第一个进程的信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多