В каждую библиотеку (согласно заданиям) помещаем экспортируемую функцию + экспортируемое данное.
Два варианта заданий:
Подсказки к интересному заданию:
1) Клиент вызывает функцию из библиотеки, передавая функции в качестве параметра заголовок приложения, например: LibMinimize(“Калькулятор”); Функция может возвращать количество минимизированных калькуляторов или получать значение глобального счетчика из библиотеки.
2) для навигации по списку top level окон можно использовать:
EnumWindows - для каждого top-окна по очереди вызывает указанную Вами в качестве первого параметра (например, MyLocalDllProc), передавая ей дескриптор очередного окна в списке top-level окон и то, что Вы указали в качестве второго параметра функции EnumWindows (например, указатель на строку с заголовком окна).
EnumWindows продолжает "идти" по списку, пока не достигнуто последнее top-level окно или функция MyLocalDllProc не вернет FALSE.
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // указатель на Вашу функцию MyLocalDllProc, которая должна быть объявлена: BOOL CALLBACK MyLocalDllProc(HWND, // дескриптор top-level - окна LPARAM) // тот параметр, который передается в EnumWindows или EnumDesktopWindows
LPARAM lParam // то, что мы в качестве параметра собираемся посылать MyLocalDllProc
);
Возвращаемое значение - не 0, если успех. 0 может быть в том случае, если MyLocalDllProc вернет 0 (GetLastError).
MyLocalDllProc - функция обратного вызова, определенная в Вашем приложении, указатель на которую используется в качестве параметра в EnumWindows (EnumDesktopWindows). Она получает в качестве параметра дескриптор очередного окна в списке top-level-окон. Возвращаемое значение - для продолжения навигации по списку - должна вернуть TRUE, для прекращения - FALSE.
Пример:
BOOL CALLBACK MyLocalDllProc(HWND hwnd, LPARAM lParam)
{
//Для получения заголовка окна с дескриптором hwnd - GetWindowText();
//Сравниваем полученный заголовок с параметром lParam
if(…)
{//совпал
//возможно, что-либо с эти окном делаем (минимизируем, закрываем…)
//Если хотим завершить просмотр списка top-level окон - return FALSE;
//продолжить - TRUE
}
//Ищем дальше
return TRUE;
}
Что можно сделать с калькуляторами: минимизировать все BOOL ShowWindow (HWND hWnd, int nCmdShow ); или BOOL CloseWindow (HWND hWnd); восстановить все BOOL ShowWindow (HWND hWnd, int nCmdShow ); или BOOL OpenIcon (HWND hWnd); закрыть все – послать сообщение WM_CLOSE
1) Выбрать вид проекта – Библиотека C++.
2) Выбрать:
· каталог размещения проекта
· и тип библиотеки
Ничего менять не надо.
После создания проекта получим следующие файлы:
#include "stat_lib.h"
/*
Stat_lib::Stat_lib() // УДАЛЯЕМ
{
}
*/
//-----------------------------------#ifndef STAT_LIB_H
#define STAT_LIB_H
/* // УДАЛЯЕМ
class Stat_lib {
public:
Stat_lib();
};
*/
#endif // STAT_LIB_H
3) Так как в библиотеке будем хранить только переменные и функции, убираем из файлов class Stat_lib
4) В файле заголовка необходимо описать переменные и функции, которые будут экспортироваться из библиотеки. Так как и библиотека, и клиент будут сделаны одним инструментом, декорирование не играет никакой роли
#endif
5) В файле .cpp определяем функции и переменные библиотеки
6) Все файлы будут находиться в рабочем каталоге stat_lib.
#------------------------------------------------#
# Project created by QtCreator 2011-12-24T12:54:33
#
#------------------------------------------------QT -= gui
TARGET = stat_lib
TEMPLATE = lib
CONFIG += staticlib
SOURCES += stat_lib.cpp
HEADERS += stat_lib.h
7) После сборки проекта получаем файл статической библиотеки с расширением .a и измененным именем (добавляется префикс lib)
libstat_lib.a , который помещается в папку Debug
8) Для того, чтобы легче было связывать библиотеку с клиентом, создадим каталог
lib – для хранения библиотек
Требуется корректировка файла проекта Stat_lib.pro. Определяем каталог для размещения результата: DESTDIR = ../lib
DESTDIR = ../lib
Клиент – GUI приложение Qt на базе QMainWindow.
Для связывания клиента с библиотекой необходимо:
· Указать h-файл библиотеки в коде, где будем использовать функцию библиотеки
#include "stat_lib.h"
· В проекте указать путь к h- файлу
INCLUDEPATH+= ../stat_lib - это рабочий каталог библиотеки
· В проекте указать саму библиотеку
LIBS+= ../lib/libstat_lib.a
INCLUDEPATH — указываем путь к h-файлу библиотеки. LIBS — подключаем библиотеку.
DESTDIR - помещаем получившуюся библиотеку в lib
Тип проекта – Win32 Console/Static library
От предкомпиляции можно отказаться
1) Создайте проект требуемого типа.
2) Минимально проект должен содержать хотя бы один .cpp (определение функций и данных) и хотя бы один .h файл (объявление экспортируемых библиотекой понятий).
3) В результате построения проекта в соответствующей папке (Debug или Release) будут созданы объектные модули и .lib-файл с именем проекта. Можно посмотреть на таблицу функций (декорированные имена!) и переменных этого .lib-файла с помощью утилиты Dumpbin из командной строки следующим образом: DUMPBIN /ALL libname
Консольное приложение
1) чтобы подключить статическую библиотеку, можно а) Insert -Files into Project или б) Build—Settings—Link—Input—Object/Library Modules – с полным или относительным путем!
2) в нужном .cpp-файле подключили заголовочный файл static_lib.h (лучше с относительным путем)
3) код, вызывающий функцию из статической библиотеки:
4) собрали исполняемый файл
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.