【问题标题】:CreateProcess method ends up with an errorCreateProcess 方法以错误结束
【发布时间】:2012-02-28 09:54:25
【问题描述】:

我的以下代码有问题:

int main(int argc, char **argv) {
  PROCESS_INFORMATION pi;  
  STARTUPINFO si;     

  printf("Process %d reporting for duty\n",GetCurrentProcessId());
  GetStartupInfo(&si);
  CreateProcess(NULL,"notepad.exe", NULL,NULL,FALSE,DETACHED_PROCESS, NULL,NULL, &si, &pi);
  printf("New Process ID: %d\n",pi.dwProcessId);
  return(0);
}        

在运行时,我在调试时运行它,它在 CreateProcess 方法上崩溃,并显示以下错误消息:“Tests.exe 中 0x7c82f29c 处的未处理异常:0xC0000005:访问冲突写入位置 0x00415760。” 什么意思???

【问题讨论】:

标签: c process operating-system


【解决方案1】:

32 位可执行文件的基地址总是0x00400000。无法写入的地址,根据异常为0x00415760。这意味着您的代码几乎肯定会尝试写入可执行映像的只读部分。例如,当您尝试写入字符串文字时,就会发生这种情况。

现在,CreateProcess 的第二个参数必须是可修改内存(它被声明为LPTSTR)。但是您正在传递一个字符串文字。将"notepad.exe" 放入可修改的缓冲区中以解决您的问题。

char CommandLine[] = "notepad.exe";
CreateProcess(NULL, CommandLine, ...

【讨论】:

  • 还有一点问题...假设我有一个包含一些方法的 .c 文件,并且我创建了一个新项目,我需要在其中创建一个使用上一个项目中的方法的流程.. ..都在同一个解决方案下。因此,我猜想“CommandLine”参数将代表第一个程序创建的 .exe 文件(具有我需要使用的方法的那个)。现在我在包含我之前发布的代码的文件中,如何访问这些方法并使用它们?
  • 这是一个不同的问题。它不能在 cmets 中解决。随意提出一个新问题。这样会引起注意。另外,请随意接受这个答案。阅读本文以了解有关 SO 工作原理的更多详细信息:meta.stackexchange.com/questions/5234
猜你喜欢
  • 2018-11-26
  • 2016-08-26
  • 1970-01-01
  • 2014-02-08
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多