Пишу враппер для старенькой игры. Рендер там программный, вывод на экран через BitBlt, в общем захотелось прикрутить этот шейдер. Поправил таблицу импорта, заменив GDI32 на свою либу. Далее инициализировал контекст OpenGL - всё прошло успешно и пытаюсь получить указатель на glCreateProgram через wglGetProcAddress, но в ответ получаю, что такой функции нет. Хорошо - собираю exe с этим кодом и получаю указатель без проблем. Далее интереснее: лезу в wglGetProcAddress отладчиком и вижу, что оно просматривает TEB в той области, которая в офф. доке называется Reserved3, чего-то там проверяет и если функция вызвана из dll - вызывает один код поиска wgl-функций (в нём только 7 wgl-функций), а если из exe - другой. Кто знает чего ему надо? Теперь что - только патчить exe и ни каких врапперов?
Там ничего не написано про такое поведение. Кстати выяснилось вот что: если инициализацию контекста проводить из exe, то потом wglCreateContext отрабатывает нормально даже из dll. Дальнейшая отладка показала, что корень зла содержится в ChoosePixelFormat если вызывать из exe - оно возвращает 7, если из dll - 0ССh. --- Сообщение объединено, 17 июл 2020 --- Вызвал DescribePixelFormat для двух случаев: далее путём нехитрых вычислений (32892 xor 33317 )and 32892 выяснил, что при вызове из dll pixelformat выбирается с флагами PFD_GENERIC_FORMAT+PFD_DRAW_TO_BITMAP+PFD_SUPPORT_GDI, флаг PFD_SUPPORT_OPENGL конечно же не установлен, поэтому wglGetProcAddress не возвращает нужные указатели. --- Сообщение объединено, 17 июл 2020 --- Нашёл свободное место в секции ресурсов, пометил её как секцию кода и запихал туда вызов ChoosePixelFormat результат тот же что и при вызове из DLL. Короче если вызывать ChoosePixelFormat не из базовой секции кода (та, что указана в BaseOfCode) - будет вот так. Но ПОЧЕМУ? Кастанеда MSDN об этом ничего не писал! --- Сообщение объединено, 17 июл 2020 --- Фу ой - у меня в заголовочнике к фасму были не правильно определены константы PFD_XXX. В общем там было так Код (Text): PFD_SUPPORT_OPENGL=20 а должно быть так Код (Text): PFD_SUPPORT_OPENGL=20h Причём я проверял их и не заметил, что "h" не хватает... EXE собирал в Delphi - вот там и работало нормально. Мама говорит я особенный...