SHFileOperation 解决double-null terminated

时间:2023-03-09 19:05:59
SHFileOperation 解决double-null terminated
SHFileOperation 解决double-null terminated
void rubyTools::funStrToWstr(string str, wstring& strw)
{
const char* pData = str.c_str();
int lengt = str.length();
UINT CodePage = ;
DWORD dwNum = MultiByteToWideChar(CodePage, ,
pData, -, NULL, );
if (dwNum == )
{
return;
} WCHAR* pwText = new WCHAR[dwNum];
memset(pwText, '\0', dwNum);
MultiByteToWideChar(CodePage, , pData, -, pwText, dwNum);
strw = pwText;
delete []pwText;
}
wstring deletePath;
funStrToWstr(mainrbPath + "\\lib", deletePath);
SHFILEOPSTRUCT FileOp = { };
FileOp.hwnd= (HWND)this->winId();
FileOp.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; const wchar_t *tmp = deletePath.c_str();
wchar_t *pTmp = const_cast<wchar_t *>(tmp);
int a = wcslen(pTmp);
//pTmp[a + 1] = '\0';//暴力增加double-null terminated.这个时候字符串结尾"\0 \0 \0 \0"了(widechar) dangerous
wchar_t *tmp2 = new wchar_t[a + ];
wmemcpy(tmp2, tmp, a);
wmemcpy(tmp2 + a, L"\0\0", ); FileOp.pFrom = tmp2;
FileOp.pTo = NULL;
FileOp.wFunc = FO_DELETE;
if( SHFileOperation(&FileOp) != )
errorNum |= replaceLibError;
delete[]tmp2;

由于参数必须是must be double-null terminated,所以要这么做,不然删除文件夹会失败的