Библиотеки. Клиент VC/ библиотека VC. Экспорт с помощью dllexport

Страницы работы

Содержание работы

Практическое занятие. Библиотеки.

В каждую библиотеку (согласно заданиям) помещаем экспортируемую функцию + экспортируемое данное.

Два варианта заданий:

  1. Простое: выполнить в библиотеке сложение, вычитание, умножение…

  1. Интересное: «дирижировать» запущенными приложениями, например, калькуляторами – минимизировать, восстановить, помигать заголовком, закрыть…

Подсказки к интересному заданию:

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. Клиент Qt/ библиотека Qt

1.1. Статическая библиотека Qt

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

1.2. Клиент Qt

Клиент – GUI приложение Qt на базе QMainWindow.

Для связывания  клиента с библиотекой необходимо:

·  Указать h-файл библиотеки  в коде, где будем использовать функцию библиотеки

#include "stat_lib.h"

·  В проекте   указать путь к  h- файлу

INCLUDEPATH+= ../stat_lib  - это рабочий каталог библиотеки

·   В проекте  указать саму библиотеку

LIBS+=  ../lib/libstat_lib.a

INCLUDEPATH — указываем путь к  h-файлу библиотеки. LIBS — подключаем библиотеку.

DESTDIR -  помещаем получившуюся библиотеку в lib

2. Клиент VC/ библиотека VC

2.1. Статическая библиотека VC

Тип проекта – Win32 Console/Static library

От предкомпиляции можно отказаться

1)  Создайте проект требуемого типа.

2)  Минимально проект должен содержать хотя бы один .cpp (определение функций и данных) и хотя бы один .h файл (объявление экспортируемых библиотекой понятий).

3)  В результате построения проекта в соответствующей папке (Debug или Release) будут созданы объектные модули и .lib-файл с именем проекта. Можно посмотреть на таблицу функций (декорированные имена!) и переменных этого .lib-файла с помощью утилиты Dumpbin из командной строки следующим образом: DUMPBIN /ALL  libname

2.2. Клиент VC

Консольное приложение

1)  чтобы подключить статическую библиотеку, можно а) Insert -Files into Project или б) Build—Settings—Link—Input—Object/Library Modules – с полным или относительным путем!

2)  в нужном .cpp-файле подключили заголовочный файл static_lib.h (лучше с относительным путем)

3)  код, вызывающий функцию из статической библиотеки:

4)  собрали исполняемый файл

Похожие материалы

Информация о работе