// UsingDll.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include #include "conio.h" #include #include "Dll1.h" using namespace std; using namespace MilitaryMan; typedef IMilitaryMan* (__cdecl *Soldier_factory)(); typedef IMilitaryMan* (__cdecl *Officer_factory)(IMilitaryMan** subordinates, int size); int main() { // Загрузка Dll HINSTANCE dll_handle = ::LoadLibrary(_T("C:\\Users\\User\\source\\repos\\Dll1\\Debug\\Dll1.dll")); if (!dll_handle) { cerr << "Unable to load DLL!\n"; return 1; } //Получаем глобальную переменную int *total_number_military = (int*)GetProcAddress(dll_handle, "total_number_military"); //Получить функцию из DLL Soldier_factory factory_Soldier = reinterpret_cast( ::GetProcAddress(dll_handle, "CreateSoldierObject")); if (!factory_Soldier) { cerr << "Unable to load CreateSoldierObject from DLL!\n"; ::FreeLibrary(dll_handle); return 1; } //Получить функцию из DLL Officer_factory factory_Officer = reinterpret_cast( ::GetProcAddress(dll_handle, "CreateOfficerObject")); if (!factory_Officer) { cerr << "Unable to load CreateOfficerObject from DLL!\n"; ::FreeLibrary(dll_handle); return 1; } //1. Проверка количества выполненных поручений у солдата. IMilitaryMan* militaryMan = factory_Soldier(); militaryMan->Serve(); //Поручение 1 для каждого подчиненного солдата militaryMan->Serve(); //Поручение 2 для каждого подчиненного солдата cout << endl; //2 IMilitaryMan* soilder4[] = { factory_Soldier(), factory_Soldier(), factory_Soldier(), factory_Soldier() }; IMilitaryMan* soilder3[] = { factory_Soldier(), factory_Soldier(), factory_Officer(soilder4, 4) }; militaryMan = factory_Officer(soilder3, 3); militaryMan->Serve(); //Поручение 1 для каждого подчиненного солдата militaryMan->Serve(); //Поручение 2 для каждого подчиненного солдата cout << endl; cout << "Number to remove subordinate soldiers " << *total_number_military; cout << endl; //3. Проверка вызова деструктора. delete militaryMan; cout << "Number after the removal of subordinate soldiers " << *total_number_military; // Destroy it explicitly ::FreeLibrary(dll_handle); _getch(); return 0; }