1

我收到错误代码 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;
}

任何帮助表示赞赏。

4

3 回答 3

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

↑ 不要投射char*wchar_t*.

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

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

使用 Visual C++(尽管它特定于该编译器)获取宽字符程序参数的一种简单方法是使用wmain而不是标准的main.


修改我忘了这是SO。那么当你投射到时实际发生了什么?char*wchar_t*

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

简而言之,不要施放。

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

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

于 2012-11-08T23:35:40.390 回答
2

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

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

如果您还想打开该文件,notepad.exe则需要重复notepad. lpCommandLine从同一页面:

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

于 2012-11-08T23:32:53.883 回答
1

You are using Ansi buffers for your parameter data, but you are calling the Unicode version of CreateProcess() instead of the Ansi version. Get rid of your type casts (the compiler would have warned you of your mistake had you nt used them) and then call CreateProcessA() directly:

//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...);
CreateProcessA(p, args, ...);
于 2012-11-09T00:32:02.673 回答