首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateProcess无法启动

CreateProcess无法启动
EN

Stack Overflow用户
提问于 2012-11-09 07:15:50
回答 3查看 390关注 0票数 1

我收到错误代码2,找不到文件。但我尝试过使用完整路径和不使用完整路径。我没有机会启动这个过程,我不知道我的错误是什么,有人能指出它吗?

这是完整的代码:

代码语言:javascript
复制
#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;
}

感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-09 07:35:40

代码语言:javascript
复制
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args,

不要将char*强制转换为wchar_t*。↑

去掉所有的C代码类型转换,你会更快乐。:-)

作为一个实际问题,使用宽字符串(wchar_t-based)来处理Windows API。

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

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

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

简而言之,不要强制转换。

每一次转换都会对编译器说:“闭嘴,编译器,因为我真的明白我在做什么,我不是因为错误才这么做的!”

如果一个人实际上不知道自己在做什么,那么其效果就是让不断试图帮助你避免灾难的工具安静下来。

票数 4
EN

Stack Overflow用户

发布于 2012-11-09 07:32:54

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

该字符串可以指定要执行的模块的完整路径和文件名,也可以指定部分名称。在部分名称的情况下,函数使用当前驱动器和当前目录来完成规范。该函数将不使用搜索路径。此参数必须包括文件扩展名;不假定有默认扩展名。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-09 08:32:03

您正在为参数数据使用Ansi缓冲区,但您调用的是CreateProcess()的Unicode版本,而不是Ansi版本。去掉你的类型转换(如果你没有使用它们,编译器会警告你错误),然后直接调用CreateProcessA()

代码语言:javascript
复制
//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...);
CreateProcessA(p, args, ...);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13299588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档