2012-11-08 44 views
1

我收到错误代码2,无法找到该文件。但我已经尝试了完整的路径而没有。 我已经没有运气让这个过程开始,我不知道我的错误是什么,有人可以指出它吗?CreateProcess将无法启动

这是全码:

#include "stdafx.h" 
#include <map> 
#include <psapi.h> 
#include "shlwapi.h" 

#define ERROR_FILE_NOT_FOUND = 2; 

void Debug(char* path[]) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    char* p = path[0]; 
    char* args = path[1]; 

    int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args, NULL, NULL, false, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); 

    if (!dwProcess) 
    { 
     DWORD dwLastErrorCode = GetLastError(); 
     printf("Error: %d", dwLastErrorCode); 
    } 

    DEBUG_EVENT debug_event = {0}; 
    DWORD dwContinueStatus = DBG_CONTINUE; 
    DWORD dwResume   = DBG_EXCEPTION_HANDLED; 

    while (!WaitForDebugEvent(&debug_event, INFINITE)) 
    { 
     switch(debug_event.dwDebugEventCode) 
     { 
      case EXCEPTION_DEBUG_EVENT: 
      { 
       EXCEPTION_DEBUG_INFO& exception = debug_event.u.Exception; 

       if (exception.ExceptionRecord.ExceptionCode == 0x0EEDFADE && exception.dwFirstChance) 
        dwContinueStatus = dwResume; 
      } 
     } 
     ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, dwContinueStatus); 
    } 
} 

int main(char* argv[]) 
{ 
    char* p[2] = { "Notepad.exe", "args" }; 
    Debug(p); 

    return 0; 
} 

任何帮助表示赞赏。

+1

你有没有尝试执行错误检查?这是你应该做的第一件事。在你这样做之后,你可能会意识到哪些参数导致了麻烦,以及为什么尽你所能编译代码是一个坏主意。这是一个开始:*如果函数失败,返回值为零。要获得扩展错误信息,请致电GetLastError。* – chris

+0

需要为notepad.exe提供绝对路径? – billz

+0

@billz,你不应该为notepad.exe。它通常位于PATH覆盖的目录中。 – chris

回答

4
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args, 

↑不要投char*wchar_t*

删除所有C演员,并更快乐。 :-)

实际上,使用宽字符串(wchar_t为基础)来处理Windows API。

使用Visual C++获取宽字符程序参数的简单方法是使用wmain而不是标准main


修订我忘了是这样。那么当你投char*wchar_t*时究竟发生了什么

那么在Windows中,每个wchar_t都是2个字节。这意味着您的字符串中的每个连续的char值将被视为一个wchar_t值,如果事件不会崩溃。它可能会崩溃,因为宽字符串的空终止符是2个零字节,而您的char字符串只能保证一个零字节,所以从CreateProcess代码的角度来看,您的字符串可能会无限期地继续。

总之,不要投。

每个演员都对编译器说,“闭嘴,编译器,因为我真的明白我在做什么,我不是这样做的! ”

如果一个人实际上并不知道自己在说什么,那么效果就是让沉默的工具不断尝试帮助您避免灾难。

2

您必须使用完整路径而不是notepad.exe

该字符串可以指定完整路径和模块的文件名 执行,也可以指定部分名称:从CreateProcess资料为准。在部分名称为 的情况下,该功能使用当前驱动器和当前目录 完成规范。 该功能不会使用搜索路径。 此参数必须包含文件扩展名;假定没有默认的 扩展名。

如果你想notepad.exe也打开该文件,你需要重复notepad一部分lpCommandLine。从同一个页面:

如果lpApplicationName和lpCommandLine都是非NULL,则 空值终止字符串由lpApplicationName指出指定 模块来执行,和空值终止字符串由 lpCommandLine指定指了指命令行。新进程可以使用GetCommandLine来检索整个命令行。 用C编写的控制台进程 可以使用argc和argv参数来解析命令 一行。因为argv [0]是模块名称,所以C程序员通常在命令行中重复模块名称作为第一个标记。

+0

它仍然不会像OP那样工作。 – chris

+0

它仅在'PATH'中查找'lpCommandLine',而不是'lpApplicationName'。 – kichik

1

您正在使用Ansi缓冲区作为您的参数数据,但您正在调用Unicode版本CreateProcess()而不是Ansi版本。摆脱你的类型转换(编译器会提醒你你的错误,你已经使用NT它们),然后直接调用CreateProcessA()

//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...); 
CreateProcessA(p, args, ...);