Объясняю ряд основных принципов.
Компилированный c/cpp файл или их группа являются библиотекой функций.
Библиотека функций может быть скомпонована в исполняемый файл (EXE) или в DLL. Различия между ними следующие:
EXE-файл имеет одну стандартную точку запуска, с которой начинается исполнение после его загрузки в память. Как правило, это функция main() или WinMain().
DLL-файл не имеет подобной точки запуска и поэтому не может исполняться как самостоятельная программа. Вместо этого он имеет одну или несколько экспортируемых функций.
На усмотрение программиста, при компоновке DLL-файла из библиотеки c/cpp, часть функций может быть экспортирована. Они будут доступны для программ, использующих данный DLL-файл. Все остальные функции будут внутренними для DLL и невидимыми для программ, использующих DLL.
Экспортировать функции можно двумя способами.
1. Указать это как атрибут при декларации функции, например:
void __declspec(dllexport) SomeFunction(int a);
2. Создать def-файл, в котором перечислить экспортируемые функции, например:
; some_library.def : Declares the module parameters for the DLL.
LIBRARY "SOME_LIBRARY"
EXPORTS
; Explicit exports can go here
SomeFunction
OtherFunction
-------------
Помимо указанного выше, у каждого DLL-файла есть специальная точка входа - DllMain, которая вызывается всякий раз, когда какая-нибудь программа подгружает данную DLL или выгружает ее. Наличие функции DllMain в библиотеке необязательно, ее можно использовать в случае необходимости инициализации каких-то переменных внутри библиотеки.