Файл dllcall/dllsrc.cpp
#define STRICT #include <windows.h>
// ======================================================== // Функция LibMain // Получает управление только один раз при // загрузке DLL-библиотеки в память // ========================================================
#pragma argsused int FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine) { // После инициализации локальной области данных // функция LibEntry фиксирует сегмент данных. // Его необходимо расфиксировать. if(wHeapSize != 0) // Расфиксируем сегмент данных UnlockData(0);
// Возвращаем 1. Это означает, что инициализация // DLL-библиотеки выполнена успешно return 1; }
// ======================================================== // Функция WEP // Получает управление только один раз при // удалении DLL-библиотеки из памяти // ========================================================
#pragma argsused int FAR PASCAL WEP(int bSystemExit) { return 1; }
// ======================================================== // Функция Msg // Выводит на экран диалоговую панель с сообщением // ========================================================
void FAR PASCAL _export Msg(LPSTR lpszMsg) { MessageBox(NULL, lpszMsg, "DLLSRC", MB_OK);
}
Функция LibMain проверяет размер локальной области данных, заказанной для DLL-приложения функцией LibEntry. Этот размер определяется значением, указанным в файле определения модуля DLL-библиотеки при помощи оператора HEAPSIZE и передается функции LibMain через параметр wHeapSize. Если DLL-библиотека имеет локальную область данных, на этапе инициализации ее необходимо расфиксировать для того чтобы разрешить Windows при необходимости произвольно изменять логический адрес сегмента данных в процессе перемещения сегментов. Использованный способ расфиксирования сегмента данных был описан в предыдущей главе и основан на использовании макрокоманды UnlockData.
После инициализации, которая в нашем простейшем примере всегда выполняется успешно, функция WinMain возвращает признак успешной инициализации - значение 1.
Задача функции WEP в нашем случае сводится к возврату значения 1, означающего успешное завершение.
Функция Msg - единственная функция предназначена для вывода строки сообщения, адрес которой передается ей в качестве параметра. Так как эта функция определена с ключевым словом _export, она может быть вызвана любым приложением. Именно эту функцию мы будем вызывать из приложения DLLCALL, исходные тексты которого приведены ниже.
Файл определения модуля для DLL-библиотеки имеет некоторые особенности (листинг 3.2).