我有一个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;
}
答案 0 :(得分:1)
您的变量sI
未初始化,并且它是输入参数。当CreateProcess
从中读取时,会发生各种不好的事情。几个成员被定义为字符串的指针。从无效指针读取不是C ++异常,这就是为什么你的catch
语句没有处理它。
修复很简单,更改
STARTUPINFO sI;
到
STARTUPINFO sI = {sizeof sI};
标准C ++库中没有任何功能与特定于操作系统的CreateProcess
一样强大。您使用CreateProcess
控制初始工作目录的功能,system
,spawn
和exec
无法做到。 (fork
+ cwd
+ exec
可以,但这是在Windows上执行操作的一种非常糟糕的方式)