Ошибка 124 — неверный уровень системного вызова для SHFileOperation

Я пытаюсь скопировать файл / каталог из одного места в другое, используя SHFileOperation.
Мой код для этого до сих пор,

    for(int index=0; index < clbSource.GetCount();index++ )
{
SHFILEOPSTRUCT SHFileOp;
CString src,dest;
std::string NULLTermination="\\0\\0";

//Get source file/directory path from CListBox
int n = clbSource.GetTextLen(index);
clbSource.GetText(index, src.GetBuffer(n));
src.ReleaseBuffer();
CT2CA pszConvertedAnsiString (src);
std::string strStdS (pszConvertedAnsiString);

//replace single slash with double
size_t found = 0, next = 0;
while( (found = strStdS.find('\\', next)) != std::string::npos )
{
strStdS.insert(found, "\\");
next = found+4;
}

//Add double null termination
strStdS.append(NULLTermination);
std::wstring stempS = s2ws(strStdS);

//Get source file/directory path from CListBox
int m = clbDest.GetTextLen(index);
clbDest.GetText(index, dest.GetBuffer(n));
dest.ReleaseBuffer();
CT2CA pszConvertedAnsiStringd (dest);
std::string strStdD (pszConvertedAnsiStringd);

//replace single slash with double
size_t foundD = 0, nextD = 0;
while( (foundD = strStdD.find('\\', nextD)) != std::string::npos )
{
strStdD.insert(foundD, "\\");
nextD = foundD+4;
}

//Add double null termination
strStdD.append(NULLTermination);
std::wstring stempD = s2ws(strStdD);//  set up File Operation structure
ZeroMemory(&SHFileOp, sizeof(SHFILEOPSTRUCT));

// application the owner of the progress dialog.
SHFileOp.hwnd = GetSafeHwnd();
SHFileOp.wFunc = FO_COPY;

SHFileOp.pFrom = stempS.c_str();
//SHFileOp.pFrom = _T("E:\\backup\\java softwares\0\0");

SHFileOp.pTo = stempD.c_str();
//SHFileOp.pTo = _T("E:\\Tmp\0\0");

// Set the flags.
SHFileOp.fFlags = FOF_SIMPLEPROGRESS;

// Do it.
DWORD result = SHFileOperation(&SHFileOp);

//Check for success
if(result!=0)
{
::AfxMessageBox(ERR_MSG_FAILED_TO_COPY);
}
else
::AfxMessageBox(SUCCESS);

}

Теперь результат не равен нулю, т.е. 124.
Также прошло через эту ссылку Системная ошибка 124 — ERROR_INVALID_LEVEL с SHFileOperation.
Не могу понять, где проблема.

Примечание. Если жестко заданные значения (как показано) передаются в SHFileOp.pFrom и SHFileOp.pTo, это работает без проблем.

Может кто-нибудь помочь ??

0

Решение

SHFileOperation не возвращает стандартные коды ошибок Windows по «историческим причинам».

MSDN: SHFileOperation, имеет список возможных результатов в разделе «Возвращаемые значения».

124 == 0x7C == Путь в источнике или месте назначения или оба неверны.

Проверьте значения, которые вы на самом деле передаете в структуре, возможно, есть ошибка в преобразовании путей.

2

Другие решения

Во-первых, std::string NULLTermination="\\0\\0" должно быть std::string NULLTermination="\0\0",

Даже тогда, std::string NULLTermination="\0\0"; не делает то, что вы думаете, что делает.

Создает пустую строку. Это потому, что конструктор std::string из char* обрабатывает строку, которую вы даете, как завершенную нулем строку. Он попадает в первый нуль и заканчивается там как пустая строка, даже не смотря на второй нуль.

Есть несколько способов создать строку с двойным завершением, вероятно, самый простой:

std::string NULLTermination;
NullTermination.push_back('\0');
1

По вопросам рекламы [email protected]