gpt4 book ai didi

c++ - 为什么 CreateProcess API 调用会导致内存访问冲突?

转载 作者:行者123 更新时间:2023-11-28 01:18:50 24 4
gpt4 key购买 nike

我有一个函数应该启动另一个进程:

DWORD WINAPI StartCalc(LPVOID lpParam) {
STARTUPINFOW info;
PROCESS_INFORMATION processInfo;
std::wstring cmd = L"C:\\Windows\\System32\\calc.exe";
BOOL hR = CreateProcessW(NULL, (LPWSTR)cmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL,
&info, &processInfo);
if (hR == 0) {
DWORD errorMessageID = ::GetLastError();
printf("Error creating process\n");
return 1;
}
return 0;
}

我在 ntdll.dll 中遇到异常“访问冲突读取位置 0xFFFFFFFFFFFFFFFF”。我知道有一些常见的错误可能会导致这种情况:

  • 调用约定不一致。我正在使用 __stdcall
  • 编码问题。我将字符串存储为宽字符
  • x64 和 x86 构建中都会出现问题
  • 当我尝试创建其他 Windows 进程时出现问题

我做错了什么?

编辑:这实际上不是将 cmd.c_str() 转换为 (LPWSTR) 的问题,该部分似乎没问题。我需要初始化 STARTUPINFO 结构:STARTUPINFO info = { 0 };

最佳答案

BOOL hR = CreateProcessW(NULL, (LPWSTR)cmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo);
                                  ^^^^^

这是类型转换。一个很好的经验法则是“发现类型转换,就发现错误”。

这里是真的。 CreateProcessW 必须传递一个可写字符串。这意味着,没有文字,也没有 c_str() 结果。

来自文档:

The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

传递一个真正的非const 指针,不要玩隐藏const 的游戏。 &cmd[0] 应该可以工作,这保证是一个可写的字符串。为了 super 安全,将 wstring 容量增加到超出您的需要,因为 CreateProcessW 将把它用作工作缓冲区。

关于c++ - 为什么 CreateProcess API 调用会导致内存访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57635089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com