Вот, делал как-то классик для работы с DLL (динамическое подключение). Может пригодится )
Использование:
TDll* Dll = new TDll("mydll.dll");
assert(Dll->Loaded); // проверить, загружена ли библиотека
Dll->Functionvoid>("FuctionName1"); // вызов функции void FuctionName1() без параметров
int i = Dll->Functionint,int,int>("Sum", 1, 2); // вызов функции int Sum(int, int)
delete Dll;
// общий принцип вызова:
// Dll->Function
// R - тип возвращаемого значения (void если нет)
// T1, T2, T3... - типы параметров функции (если есть)
Экономит время в части загрузки / выгрузки библиотеки и объявления функций. Что касается потока - здесь все стандартно. Главное - не забывай память освобождать )