Для Win32 сведения о загрузчике находятся на MSDN. Смотрите здесь .
Исходя из кода C ++, вы правы (для Windows), загружаете с помощью :: LoadLibrary и разрешаете указатели на функции с помощью :: GetProcAddress. Обычно вы преобразуете результат GetProcAddress в тип, который вам известна как функция точки входа, а затем используете его в своей программе.
Например, если у вас есть архитектура подключаемого модуля, например, браузер, вы решите, какой каталог у вашего подключаемого модуля, получите список имен файлов для этого каталога, и вызовите :: LoadLibrary для каждой DLL (фильтрация имен файлов быть до вас). Для каждого из них вы должны разрешить необходимые точки входа с помощью GetProcAddress, сохранить их в структуре для этой библиотеки и поместить в какой-либо список плагинов. Позже вы будете вызывать эти указатели функций, чтобы плагин работал.
Если вы укажете относительный путь (например, «foo.dll», а не «c: \ foo.dll»), появится путь поиска в библиотеке ОС. Подробности в MSDN.
Кроме того, библиотеки DLL загружаются в адресное пространство вашего процесса. Как правило, вас не волнует, где, но в прошлом вы могли ускорить загрузку, «перебазировав» свои библиотеки DLL. Я не думаю, что есть какие-либо гарантии того, как загрузчик ОС помещает библиотеки в память, но вы всегда можете получить базовый адрес в адресном пространстве вашего процесса.
Точка входа вашей DLL (dllmain) также может отвечать на различные сообщения - присоединение потока, присоединение процесса - для разумной инициализации.