SHFILEOPSTRUCT
ожидает строки, заканчивающиеся двумя символами NUL, но строки, заканчивающиеся NUL, по определению заканчиваются одним , а любые дополнительные символы NUL игнорируются CString
методами, которые неt принимать аргумент явной длины.
Вы можете принудительно задать двойной NUL, добавив один вручную:
CString cstrTempDest = firstPathDest + lastPartDest + _folderNameDest;
// *** Add NUL manually ***
cstrTempDest.AppendChar( 0 );
s.pTo = cstrTempDest;
// For debuging - verify resulting string with example.
TCHAR* test = _TEXT("C:\\ORTIM-Daten\\a5Pc 2.0.3\\Documents\\a6_töüst-Oa5Z.OZS-CI5O5235\0");
// +2 because we want to check two NULs at end.
ASSERT( memcmp( s.pTo, test, (_tcslen(test)+2)*sizeof(TCHAR) ) == 0 );
Альтернативное решение может использовать методы с аргументом явной длины:
CString cstrTempDest = firstPathDest + lastPartDest
+ CString(_folderNameDest, _tcslen(_folderNameDest)+1);
Если ваш проект настроен на использование набора символов Unicode, вызовите конструкторы CString
с широкими строками:
CString _folderName(_T("a6_töüst-Oa5Z.OZS-CI5O5235")),
firstPath(_T("C:\\ORTIM-Daten\\a5Pc 2.0.3\\Temp\\"))
...
CString
в режиме Unicode автоматически преобразует узкие строки в широкие, но может потерпеть неудачукогда есть несоответствие между кодовыми страницами времени выполнения и разработки.Если вы планируете использовать Unicode и никогда не оглядываться назад, отбросьте макросы _TEXT
, TEXT
и _T
и просто используйте широкие литералы:
CString _folderName( L"a6_töüst-Oa5Z.OZS-CI5O5235" ),
firstPath( L"C:\\ORTIM-Daten\\a5Pc 2.0.3\\Temp\\" )
...
Вам также следует проверить SHFileOperation
возвращаемое значение.