No LIB-file need to be linked statically to calling application if dynamic linking is used. Instead DLL loaded dynamically at run-time. This sample shows how expicit dynamic linking works. With explicit linking, wheather DEF-file used or not, you use Win32 API functions LoadLibrary and GetProcAddress to load DLL into memory space of the calling process and get a pointer to a function from DLL. Note: COM DLLs, which are always loaded dynamically, use single function CoCreateInstance instead of 2 functions LoadLibrary and GetProcAddress. Since DEF-file enlists exported functions, __delspec(dllexport) declaration (that allows linker to figure out what elements of DLL are exported) before exported function in a DLL is optional. Therefore, writing a code for DLL following the same rules as for writing a code for Win32 EXE application. You must add only (manually) DEF text file and declare exported functions in it. If DEF-file is not used, and still you want to implement explicit dynamic linking two changes are required to this sample code. First, put __delspec(dllexport) before any function in DLL that you are going to call from EXE. Second, in calling application, replace: pFunction = (PFUNCTION)GetProcAddress(hLibrary, "WriteString"); with pFunction = (PFUNCTION)GetProcAddress(hLibrary, "?WriteString@@YAXXZ"); Unfortunately, decorated name for WriteString function need to be used. This is a downside of explicit dynamic linking not using DEF-file. You can figure out decorated name by using depends or dumpbin utilities.