Объясняю ряд основных принципов.

Компилированный 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 в библиотеке необязательно, ее можно использовать в случае необходимости инициализации каких-то переменных внутри библиотеки.