gpt4 book ai didi

c++ - 几次调用后外部程序执行失败

转载 作者:太空狗 更新时间:2023-10-29 21:45:00 25 4
gpt4 key购买 nike

我想调用一个外部程序将 BMP 文件转换为 DDS 文件,但调用了几次后它一直崩溃。我尝试了 ShellExecuteCreateProcessor。这里是 ShellExecute 的例子:

path = "C:\\pictures";
file = "C:\\pictures\\test.bmp";
string cmd = "-f BC1_UNORM -o " + path + " " + file;
char* cmdConvert= new char[cmd.size()];
strcpy(cmdConvert, cmd.c_str());
int buffSize = (int)strlen(cmdConvert) + 1;
LPWSTR cmdL= new wchar_t[buffSize];
MultiByteToWideChar(CP_ACP, 0, cmdConvert, buffSize, cmdL, buffSize);

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShEecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = _T("C:\\Texconv\\texconv.exe");
ShExecInfo.lpParameters = cmdL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp = NULL;

ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
CloseHandle(ShExecInfo.hProcess);

delete convertMe;
delete gah;

它在 ShellExecuteEx(&ShExecInfo) 之后直接崩溃。一定有一些竞争条件(或类似的东西),因为它在调试器中运行时不会崩溃(我使用的是 VS2012)。

最佳答案

您在第 4 行中缺少一个终端零:

char* cmdConvert= new char[cmd.size()];

写:

char* cmdConvert= new char[cmd.size()+1];

因为,我想你现在已经知道了,空字符串缓冲区是一个字节长,因为终端零字符。 cmd.size() 不包含此终端字符。对于 sring 缓冲区,您必须向字符串长度添加一个字节。发布版本中的崩溃是在该缓冲区之后覆盖某些内容的结果。在 Debug模式下,新运算符在分配的缓冲区的开头和结尾填充一些字节以支持缓冲区覆盖检测,这就是它在 Debug模式下运行的原因。

关于c++ - 几次调用后外部程序执行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18657128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com