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. Если вы явно не попросите об этом.