Это работает по той же причине, что
GetThreadContext(hThread, lpContext);
работает. Именованные функции, используемые в вашем коде, должны быть разрешены во время ссылки, иначе ссылка не будет выполнена. Неважно, берете ли вы их адрес с помощью &
или звоните им. Во время выполнения DLL загружается, и имя функции затем разрешается в конкретный адрес в процессе.
Файлы PDB используются только для предоставления расширенной символической информации во время отладки. Обычно они не используются во время выполнения.
[Не могу не подумать, что что-то упустил из-за этого вопроса. Скажи мне, если это не твоя проблема.]