如何在LPCWSTR末尾追加DWORD以作为CreateProcess命令行参数?
解决方法:将DWORD追加到宽字符串末尾作为CreateProcess命令行参数
直接强制转换DWORD为wchar_t*是错误的——这会把数值当作内存地址去读取,属于非法访问,必然导致错误。正确的思路是先把DWORD转换成宽字符串,再拼接目标字符串。
方法1:使用C标准库函数(C风格)
- 先将
DWORD格式化为宽字符串缓冲区 - 再用安全字符串函数拼接
示例代码:
// 假设目标命令行缓冲区足够大(根据实际需求调整大小) wchar_t command_line[256] = L"target.exe "; DWORD id = 0x1234; // 示例DWORD值 // 定义缓冲区存储转换后的ID字符串(DWORD最大十进制是10位,十六进制是8位,20足够) wchar_t id_str[20]; // 将DWORD转为十进制宽字符串,若要十六进制则用L"%x" _swprintf_s(id_str, _countof(id_str), L"%lu", id); // 安全拼接字符串,确保目标缓冲区大小足够 wcsncat_s(command_line, _countof(command_line), id_str, wcslen(id_str)); // 之后将command_line传入CreateProcessW CreateProcessW(NULL, command_line, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
方法2:使用C++ std::wstring(更安全简洁)
用C++的宽字符串类可以自动管理内存,避免手动计算缓冲区大小:
#include <string> std::wstring cmd_line = L"target.exe "; DWORD id = 12345; // 直接将DWORD转为wstring并追加 cmd_line += std::to_wstring(id); // CreateProcessW的第二个参数需要可写的缓冲区,因此传&cmd_line[0]而非c_str() STARTUPINFOW si = { sizeof(si) }; PROCESS_INFORMATION pi; CreateProcessW(NULL, &cmd_line[0], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
注意:CreateProcessW的第二个参数(命令行)要求是可修改的字符串,因此用std::wstring时不要直接传c_str()(返回const指针),而是传&cmd_line[0]确保可写。
内容的提问来源于stack exchange,提问作者DesdreMBM
相关产品推荐
相关产品推荐

