Операционная система Microsoft Windows 3.1 для программиста -том 3

       

Файл discard/dll.def


; ============================= ; Файл определения модуля ; ============================= LIBRARY DLL DESCRIPTION 'DLL-библиотека DLL, (C) 1994, Frolov A.V.' EXETYPE windows CODE preload fixed DATA preload moveable single HEAPSIZE 1024 EXPORTS NotifyProc @10

Исходя из требований функции извещения, сегмент кода DLL-библиотеки сделан фиксированным. Кроме того, мы использовали оператор EXPORTS для экспортирования функции извещения и задали для этой функции порядковый номер.

Теперь о том, почему для создания DLL-библиотеки мы выбрали язык C, а не С++.

Как вы знаете, трансляторы языка C++ "разукрашивают" имена функций в объектном модуле, добавляя к ним символы, обозначающие типы аргументов и тип возвращаемого значения. Когда в файле определения модуля в разделе EXPORTS мы перечисляем имена функций, при сборке загрузочного файла DLL-библиотеки редактор связей будет искать в объектном модуле функции с перечисленными именами. Если же исходный текст составлен на языке C++, имена, расположенные в объектном модуле, будут мало напоминать использованные в исходном тексте. В результате редактор связей выведет сообщение о том, что он не может найти в объектном модуле указанные в файле определения модуля экспортируемые функции.

Если же исходный текст DLL-библиотеки составлен на языке C, эти проблемы исчезнут. Однако в этом случае при вызове таких экспортируемых функций из приложений, составленных на языке C++, вам придется объявить их как extern"C".

Если же для разработки DLL-библиотеки используется язык C++, для обеспечения доступа к экспортируемым функциям вы можете либо использовать библиотеку импорта, созданную приложением IMPLIB, либо описать экспортируемую функцию следующим образом (в качестве примера использован исходный текст одной из функций DLL-библиотеки, описанной в разделе "Приложение WINHOOK"):

extern "C" void WINAPI _export RemoveKbHook(void) { if(bHooked) { UnhookWindowsHookEx(hhookMsg);
UnhookWindowsHookEx(hhook);
} }

Описание extern "C" отменяет для определяемой функции соглашение языка C++ об именах функций.



Содержание раздела