如何组合两个 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
。
- 如@jkb 所述,使用
std::wstring
;
- 使用
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);
我想做的是在编辑子 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
。
- 如@jkb 所述,使用
std::wstring
; - 使用
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);