DLL без экспортируемых функций?
Я немного искал в DLL MS-Office, и я заметил, что некоторые из DLL не имеют каких-либо экспортированных функций. Что я не совсем понимаю, как приложение может использовать эти библиотеки DLL без каких-либо экспортированных функций?!
Я имею в виду, что dllmain() действительно выполняется в LoadLibrary(), но в чем смысл? Зачем кому-то создавать DLL без экспортированных функций?
спасибо!: -)
Ответы
Ответ 1
Один из способов иметь дело с версиями программы, предназначенной для разных языков, - это перевести все ресурсы в языковую DLL. DLL не содержит никакого кода, а только ресурсы, которые были переведены на целевой язык. Когда основная программа запускается, все, что ей нужно сделать, это загрузить соответствующую DLL языка.
Ответ 2
Я не рассматривал DLL в вопросе; но это возможно в чем-то вроде MSOffice. Microsoft сделала это, чтобы запутать DLL, чтобы сделать его более сложным для отладки/реконструирования.
Однако, как вы спрашиваете, как бы вы использовали такую DLL? Хорошо, если приложение знает макет DLL, тогда он может создать указатель функции с адресом известной функции и вызвать его.
Если вы действительно хотите копать дальше, вы можете objdump DLL и искать стандартные прологи и эпилогические функции ABI функции ABI и, возможно, работать там, где начинаются функции.
Ответ 3
Когда вы вызываете LoadLibrary, DLL получает вызов своего DllMain.
Это точка входа в DLL. Он называется приложением процесса и прикреплением резьбы.
Таким образом, у вас есть точка входа.
Как только у него есть хотя бы одна точка входа, он может создать экземпляр некоторого интерфейса (например, factory), установленного, например, TLS, где другие модули будут получать их.
Таким образом, вы можете иметь COM-систему с интерфейсами, которые не отображаются снаружи, кроме приложения. Что-то вроде этого - возможны многие варианты.
Ответ 4
Ресурсы
В DLL, вероятно, есть ресурсы, такие как строковые таблицы, изображения, значки и т.д., используемые остальной частью Office.
Ответ 5
Всегда возможно, что они просто не экспортируют их как C-интерфейсы. DLL не волшебство, это просто бит и байты, и ничто не говорит о том, что вы не можете получить код из DLL, если вы не попросите Windows для него. Я считаю, что .NET использует этот подход: они сохраняют метаданные в DLL, которые сообщают CLR, что в нем, вместо того, чтобы делать функции .NET доступными обычным методом GetProcAddress. Если вы явно не попросите об этом.