Насколько я понимаю, вы немного запутались, потому что хотите использовать библиотеки DLL вместо библиотек.
Хитрость в том, что Kernel32.Lib, User32.Lib, AdvAPI32.Lib и т. Д. не имеют реализации используемой вами функции. Более того, если вы используете такие функции, как CreateFileW
или MessageBoxW
, в вашей программе ссылки на функцию не будут разрешены после компиляции. Поэтому, не имея LIB, неразрешенные ссылки останутся также в EXE. Это будет плохо по причине. Чтобы быть исполняемым, EXE должен был разрешить все внешние ссылки и, кроме того, точно знать , какие функции должны быть найдены в каких DLL . Так называемая библиотека импорта поможет решить проблему. Например, библиотека импорта Kernel32.Lib содержит информацию о функции CreateFileW
, а User32.Lib - информацию о MessageBoxW
. Если вы используете список библиотек импорта, таких как Kernel32.Lib, User32.Lib, AdvAPI32.Lib, ваш EXE-файл разрешает все ссылки и включает точный список библиотек DLL, которые ему нужны, и список функций, используемых в соответствующей библиотеке DLL в специальном Таблица импорта (см. http://en.wikipedia.org/wiki/Portable_Executable#Import_Table, http://msdn.microsoft.com/en-us/library/ms809762.aspx и http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx). Итак. Если запустить EXE-файл, операционная система загружает DLL в адресное пространство процесса и разрешается до конец всех ссылок вплоть до адресов всех используемых функций.
Обычно библиотеки импорта создаются компоновщиком ( link.exe ) при компиляции DLL. Также возможно создать библиотеку импорта, которая соответствует DLL в отношении утилиты lib.exe . (см. http://msdn.microsoft.com/en-us/library/0b9xe492.aspx)