Суть проблемы в следующем: при запуске release-версии программы, лоадер записывает в IAT адрес не той функции, что указана в импорте. На скриншоте в аттаче видно пример. Вместо адреса LockResource там адрес SetHandleCount, причем функции SetHandleCount нет в импорте вообще, даже текстовой строки в файле нет такой. Кто-нибудь сталкивался с таким? Что делать? win2k sp4 p.s. В debug-версии все нормально. p.p.s нет аттача, видимо, размерчик большой. http://rapidshare.de/files/31673036/vc6.LockResource.rar.html 225K
Эта функция в XP имеет 2 имени: LockResource и SetHandleCount: Код (Text): ; Exported entry 597. LockResource ; Exported entry 784. SetHandleCount ; Attributes: bp-based frame ; UINT __stdcall SetHandleCount(UINT uNumber) public SetHandleCount SetHandleCount proc near uNumber= dword ptr 8 mov edi, edi ; LockResource push ebp mov ebp, esp mov eax, [ebp+uNumber] pop ebp retn 4 SetHandleCount endp Кстати, как можно заметить, эта функция ничего не делает ЗЫ: А картинку можно было запросто в 20К поместить при нормальном сжатии.
Точно, в 2к то же самое. Начитаешься тут msdn'ов и голову ломаешь в поисках багов там где их нет Интересно, сколько еще таких "полезных" функций в сист. библиотеках?.. Я пробовал. Не получилось
Итак, баг был в следующем: Программка хранит в ресурсах данные которые во время работы слегка модифицирует и сохраняет в файл. Падать начала в release-сборке при попытке записи по указателю, возвращаемому LockResource (хм, LoadResource ). Багов в виндовском лоадере нет, все оказалось проще Память по этому адресу (секция .rsrc) доступна только на чтение, и в debug-версии обработчик исключения (отсутствующий в release) изменял атрибуты секции на Read-Write, повторял запись по указателю и устанавливал атрибуты обратно в ReadOnly.
rmn А в msdn по этому поводу чётко написано, что буфер LockResource доступен только для чтения. Зря Вы разочаровались в msdn Можно в опциях линкера задать секции rsrc атрибут W.