Судя по всему, вы неправильно формируете списки pFrom и pTo.
Вам нужно сформировать их так, чтобы у каждого был нулевой терминатор между ними и двойной нулевой терминатор в конце.
Пример повторной реализации вашей функции:
TCHAR* tempBuf = FromBuf;
for (int i = 0; i < srcPaths.size(); ++i)
{
const CString& filePath = srcPaths[i];
_tcscpy_s( tempBuf, fromBufLength, filePath.GetString() );
tempBuf += filePath.GetString() + 1; // Include null terminator in the increment.
}
*tempBuf = '\0'; // Add extra null terminator.
Основные проблемы в исходном коде заключаются в том, что вы не обращаете внимания на требуемые нулевые терминаторы между каждым именем файла. Вы пробовали запустить то, что у вас есть, через отладчик и посмотреть, что содержит FromBuf? Я подозреваю, что вы бы увидели проблему очень быстро, если бы видели.
Надеюсь, это поможет!