CReateProcess()API导致未处理的异常。用于CreateProcess的C ++ std :: alternative API

时间:2014-08-14 06:12:01

标签: c++ exception visual-c++ exception-handling createprocess

我有一个Vc ++代码,一个A.EXE项目(MBCS)和一个静态库项目(Unicode)。静态库(* .lib)项目具有如下代码,它尝试从其中启动不同的exe(例如pwrtest.exe)。在执行CReateProcess()语句时,BUt代码崩溃。

  

错误是"" A.EXE"中的(ntdll.dll)未处理的Eception;   ::访问违规读取位置0xCCCCCCCC

我确保appPath&中的值workdir是正确的。 他们是这样的价值:: c:\ Users \ abcd \ xyz \ somedirectory \ abc等... 目录名用双斜杠分隔" \"。

我真的不明白这是什么问题。

此外,我还提出了一个try catch语句,但当我在CreateProcess()行中插入代码(F10)时,它会立即崩溃并抛出异常,如上所述。 所以它甚至没有发表声明。

由于Create process()是一个C API&amp; C类型总是倾向于内存等等。只是想知道是否有一个C ++ STD ::库对应(一些容器函数API),它更简单但是可以完成CreateProcess()C API的工作。 < / p>

 PROCESS_INFORMATION pI;
    STARTUPINFO         sI;
    LPTSTR              appPath;
    LPTSTR              workDir;

    wchar_t cwd[_MAX_PATH];
    GetCurrentDirectory(_MAX_PATH, cwd);
    wchar_t TestEXEPath[_MAX_PATH];
    wcscpy(TestEXEPath, cwd);

    wcscat(TestEXEPath, L"\\somedircetory\\abc\\pwrtest.exe /sleep /c:1");

    appPath = TestEXEPath;
    wchar_t workDirForTestEXE[_MAX_PATH];
    wcscpy(workDirForTestEXE, cwd);
    wcscat(workDirForTestEXE, L"\\somedirectory\\abc");
    workDir = workDirForTestEXE;

    try
    {
        if (!CreateProcess(NULL, appPath, NULL, NULL, FALSE, 0, NULL, workDir, &sI, &pI))
        {
            ......
        }
        {
            ......
        }
    }
    catch (exception& exType)
    {
        std::cout << "ExType is" << exType.what() << endl;
    }

1 个答案:

答案 0 :(得分:1)

您的变量sI未初始化,并且它是输入参数。当CreateProcess从中读取时,会发生各种不好的事情。几个成员被定义为字符串的指针。从无效指针读取不是C ++异常,这就是为什么你的catch语句没有处理它。

修复很简单,更改

STARTUPINFO sI;

STARTUPINFO sI = {sizeof sI};

标准C ++库中没有任何功能与特定于操作系统的CreateProcess一样强大。您使用CreateProcess控制初始工作目录的功能,systemspawnexec无法做到。 (fork + cwd + exec可以,但这是在Windows上执行操作的一种非常糟糕的方式)