2012-02-06 54 views
3

我有一个问题,我下面的代码:CreateProcess的方法结束了一个错误

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

而且对乳宁的时候,我跑这同时debuggin和崩溃的CreateProcess的方法,与此错误消息:“在Tests.exe中的0x7c82f29c未处理的异常:0xC0000005:访问冲突写入位置0x00415760”。 这是什么意思?

回答

3

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

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

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

哦,它的工作!日Thnx! – Inbali 2012-02-06 22:41:15

+0

Drat!通过API文档的缓慢粘贴链接打败我。 :) +1 – 2012-02-06 22:44:27

+0

还有一个问题...让我说我有一个.c文件的一些方法,我创建一个新的项目,我需要做一个过程,使用previouse项目的方法....所有在相同的解决方案下。 因此,我猜“CommandLine”参数将代表由第一个程序(带有需要使用的方法的那个)创建的.exe文件。 现在我使用之前发布的代码存在文件中,如何访问这些方法并使用它们? – Inbali 2012-02-06 22:54:28