Closed pult closed 7 years ago
https://forum.farmanager.com/viewtopic.php?p=142164#p142164
Кто соберёт, выложите плиз бинарник
bcopy_common.cpp(26) : error C2146: синтаксическая ошибка: отсутствие "," перед идентификатором "_Dest"
bcopy_common.cpp(26) : error C2733: вторая С-компоновка перегруженной функции "swprintf" не допускается
bcopy_common.cpp(26): см. объявление "swprintf"
Из 2015 тоже, ошибки в той же стороке
http://bugs.farmanager.com/view.php?id=3350
Far 3 x64 build 4839 : BCopy.dll AV/Trap on OpenPlugin AV/Падение при попытке вызвать диалог копирования для плагина bcopy.dll для x64 (x86 - этой проблемы нет). Предыдущая сборка 4833 этой проблемы не имеет!
>DrKnS: Падает здесь: di.History = AnsiToUnicode(diA.History); Потому что diA.History - 0xcccccccc6194e26a, что как-то не очень похоже на валидный адрес. Однако, если мы отбросим старший дворд и посмотрим на 6194e26a как на char*, то увидим "BCopyCopy", что уже теплее. Поискав "BCopyCopy" в исходниках плагина, мы найдём его в инициализации того самого диалога копирования:
Т. е. BCopyCopyHistoryName пишется в DWORD_PTR InitDialogItem.Selected, а потом функция InitDialogItems переписывает этот Selected в int FarDialogItem.Selected, пытаясь впихнуть невпихуемое, а именно 64 бита в 32. Что же в этом плохого?
Раньше оно у вас работало только потому, что звёзды удачно располагались - адрес литерала "BCopyCopy" укладывался в 32 бита, а стек, на который ложилась структура диалога, кто-то до этого случайно очищал (скорее всего там поблизости был вызов sprintf, который в 4834 убрали), обнуляя этим старшие биты адреса.
Иными словами - это баг плагина.