Winapi CreateProcess赢得';开始

Winapi CreateProcess赢得';开始,winapi,Winapi,我收到错误代码2,找不到该文件。但我试过用完整的路径,也试过不用。 我没有幸运地开始这个过程,我不知道我的错误是什么,有人能指出吗 这是完整的代码: #include "stdafx.h" #include <map> #include <psapi.h> #include "shlwapi.h" #define ERROR_FILE_NOT_FOUND = 2; void Debug(char* path[]) { STARTUPINFO si; P

我收到错误代码2,找不到该文件。但我试过用完整的路径,也试过不用。 我没有幸运地开始这个过程,我不知道我的错误是什么,有人能指出吗

这是完整的代码:

#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;
}
#包括“stdafx.h”
#包括
#包括
#包括“shlwapi.h”
#定义错误文件未找到=2;
无效调试(字符*路径[])
{
STARTUPINFO si;
处理信息;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
零内存(&pi,sizeof(pi));
char*p=路径[0];
char*args=路径[1];
int dwProcess=CreateProcess((LPCWSTR)p,(LPWSTR)args,NULL,NULL,false,DEBUG_ONLY_THIS_进程,NULL,NULL,&si,&pi);
if(!dwProcess)
{
DWORD dwLastErrorCode=GetLastError();
printf(“错误:%d”,dwLastErrorCode);
}
调试事件调试事件={0};
DWORD dwContinueStatus=DBG_CONTINUE;
DWORD dwResume=DBG_异常处理;
while(!WaitForDebugEvent(&debug_event,无限))
{
开关(debug_event.dwDebugEventCode)
{
案例异常\u调试\u事件:
{
异常调试信息&EXCEPTION=DEBUG\u event.u.EXCEPTION;
if(exception.ExceptionRecord.ExceptionCode==0x0EEDFADE&&exception.dwFirstChance)
dwContinueStatus=dwResume;
}
}
ContinuedBugEvent(debug_event.dwProcessId、debug_event.dwThreadId、dwContinueStatus);
}
}
int main(字符*argv[]
{
char*p[2]={“Notepad.exe”,“args”};
调试(p);
返回0;
}

感谢您的帮助。

您必须使用完整路径,而不仅仅是
notepad.exe
。摘自文件:

字符串可以指定要创建的模块的完整路径和文件名 执行,也可以指定部分名称。在部分 名称,函数使用当前驱动器和当前目录 完成规格说明该功能将不使用搜索路径。 此参数必须包含文件扩展名;无违约 扩展是假定的

如果希望
notepad.exe
也打开该文件,则需要重复
lpCommandLine
notepad
部分。从同一页:

如果lpApplicationName和lpCommandLine都不为NULL,则 lpApplicationName指向的以null结尾的字符串指定 要执行的模块,以及 lpCommandLine指定命令行。新流程可以使用 GetCommandLine以检索整个命令行控制台进程 用C编写的程序可以使用argc和argv参数来解析命令 线因为argv[0]是模块名,所以C程序员通常 将模块名称作为命令行中的第一个标记重复。


您必须使用完整路径,而不仅仅是
notepad.exe
。摘自文件:

字符串可以指定要创建的模块的完整路径和文件名 执行,也可以指定部分名称。在部分 名称,函数使用当前驱动器和当前目录 完成规格说明该功能将不使用搜索路径。 此参数必须包含文件扩展名;无违约 扩展是假定的

如果希望
notepad.exe
也打开该文件,则需要重复
lpCommandLine
notepad
部分。从同一页:

如果lpApplicationName和lpCommandLine都不为NULL,则 lpApplicationName指向的以null结尾的字符串指定 要执行的模块,以及 lpCommandLine指定命令行。新流程可以使用 GetCommandLine以检索整个命令行控制台进程 用C编写的程序可以使用argc和argv参数来解析命令 线因为argv[0]是模块名,所以C程序员通常 将模块名称作为命令行中的第一个标记重复。

↑ 不要将
char*
转换为
wchar\u t*

移除所有C型铸造,并更快乐。:-)

实际上,使用宽字符串(
wchar\t
)来处理Windows API

一个用Visual C++获取宽字符程序参数的简单方法(虽然它对编译器是特定的)是使用<代码> WMeN>代码>代替标准<代码>主< /COD>


修正案我忘了是这样的。那么,当您将
char*
强制转换为
wchar\u t*
时,实际会发生什么呢

在Windows中,每个
wchar\u t
是2个字节。这意味着,如果字符串没有崩溃,字符串中的每一对连续的
char
值都将被视为一个
wchar\t
值。它可能会崩溃,因为宽字符串的空终止为2个零字节,而
char
字符串只保证一个零字节,因此从
CreateProcess
代码的角度来看,字符串可能会无限期地继续

总之,不要投

每个演员都对编译器说:“闭嘴,编译器,因为我真的明白我在做什么,我没有错!”

如果一个人实际上不知道自己在做什么,那么结果就是让这个一直试图帮助你避免灾难的工具沉默

↑ 不要将
char*
转换为
wchar\u t*

移除所有C型铸造,并更快乐。:-)

实际上,使用宽字符串(
wchar\t
)来处理Windows API

一个用Visual C++获取宽字符程序参数的简单方法(虽然它对编译器是特定的)是使用<代码> WMeN>代码>代替标准<代码>主< /COD>


修正案我忘了是这样的。那么,当您将
char*
强制转换为
wcha时,实际会发生什么呢
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args,
//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...);
CreateProcessA(p, args, ...);