Здравствуйте, Denn, Вы писали:
D>Здравствуйте, Deff, Вы писали:
D>>недавно столкнулся с интересной проблемой: секция ресурсов моего exe-файла (в силу специфики задачи) содержит два экземпляра RT_VERSION, один из которых имеет стандартный идентификатор 1, а второй имеет строковое название PROD_DATA. Работать с GetFileVersionInfoSize, GetFileVersionInfo возможно только для ресурса 1, а D>>PROD_DATA нужно обрабатывать с помощью функций работы с ресурсами. D>>Работаю по схеме D>>FindResource -> LoadResource -> LockResource. Размер получаю с помощью SizeofResource.
D> В MSDN это запрещено, явно требуют использовать GetFileVersionInfoSize, ...
Мне не попадался подобный запрет. Более того, не вижу его причины (объяснимой). Мне это видится просто как API разного уровня. И ограничение, что версия, с которой можно работать версионным API, должна иметь ID = спец.константа (== 1) мне непонятно.
D>>Все благополучно, пока не начнется работа с VerQueryValue. D>>Использование VerQueryValue с указателем от LockResource приведет к исключению ACCESS_VIOLATION. D> Причем программа попытается вернуться после обработки обработчика catch(...) в код после вызова VerQueryValue. Бессовестно давит исключение..
D>>Интересно, если кто сталкивался с этой проблемой — как она решалась, и если подобным образом, как вычислялся необходимый минимальный размер буфера. D> Отказались от этой затеи, грязный хак ничего хорошего не даст. Но тем не менее, не вижу смысла минимизировать размер буфера, чем больше запас, тем больше шансов, на "выживание", в разных версиях Windows D>размеры структур могут и поменяться.
затея не очень, однако что делать в случае, если по задумке (пусть и спорной) требуется работать с exe-файлами в которых несколько ресурсов типа версии с различными ID?