Бібліотека - це скомпільований код, який забезпечує функції виконуваного додатка і надає йому дані. Бібліотеки можуть бути пов'язані статично і динамічно, зазвичай у них розширення LIB і DLL відповідно. Статичні бібліотеки (наприклад, бібліотека часу виконання C) зв'язуються з додатком під час компіляції і стають частиною отриманого виконуваного файлу. Додаток завантажує бібліотеку DLL, коли вона необхідна (зазвичай при запуску). Одна бібліотека DLL може завантажувати іншу бібліотеку DLL і динамічно посилатися на неї.
Нижче наведені основні переваги бібліотек DLL.
Всі додатки можуть використовувати одну копію на диску.
Виконувані файли додатків меншого розміру.
Можливість розбивати великі проекти. Розробники додатків і бібліотек DLL повинні тільки узгодити інтерфейс відповідних частин. Цей інтерфейс експортується в бібліотеці DLL.
Розробники DLL можуть оновлювати бібліотеки DLL, щоб підвищити їх ефективність або виправити помилку, не оновлюючи все використовують їх застосування, якщо експортований інтерфейс бібліотеки DLL не змінюється.
За допомогою DLL можна додавати функції і команди в Microsoft Excel.
Ось що потрібно, щоб створити бібліотеку DLL:
Компілятор для перетворення вихідного коду в об'єктний, сумісний з обладнанням.
Компоновщик для додавання коду з статичних бібліотек і створення виконуваного DLL-файлу.
Ви можете створювати бібліотеки DLL на декількох мовах, наприклад C / C ++, Pascal і Visual Basic. Так як вихідний код API Excel - C і C ++, в цій документації розглядаються тільки ці дві мови.
При компіляції проекту DLL компілятор і компонувальник повинні знати, які функції експортувати, щоб надати до них доступ в додатку. У цьому розділі описані можливі способи.
При компіляції вихідного коду компілятори зазвичай змінюють імена функцій. Для цього вони зазвичай додають символи в початок або кінець імені. Цей процес називається декорування імені. Необхідно переконатися, що додатки, що завантажуються бібліотеку DLL, може розпізнати ім'я функції, що експортується. Для цього може знадобитися дати вказівку компонувальнику зіставити розширене ім'я з більш простим ім'ям експорту. Це може бути ім'я з вихідного коду або інше.
Спосіб декорування імені залежить від мови та способу виклику функції, що задається компілятором, т. Е. Угоди про виклики. Стандартне межпроцессное угоду про виклики для Windows, що використовується в бібліотеках DLL, - це WinAPI. У файлах заголовків Windows воно позначене як WINAPI за допомогою деклараторів Win32 __stdcall.
Функція, що експортується в DLL-файл для Excel (функція листа, функція, еквівалентна листу макросів, або призначена для користувача команда) завжди повинна використовувати угоду про виклики WINAPI / __stdcall. В визначення функції необхідно явно включити покажчик WINAPI. так як за замовчуванням в компіляторах Win32 використовується угоду про виклики __cdecl. також позначене як WINAPIV.
Ви можете повідомити компонувальнику про необхідність експорту функції, а також її зовнішнє ім'я декількома способами:
Помістіть функцію в DEF-файл після ключового слова EXPORTS і додайте посилання на цей файл в параметр проекту DLL під час зв'язування.
Використовуйте декларатор __declspec (dllexport) у визначенні функції.
Використовуйте директиву препроцесора #pragma для відправки повідомлення компонувальнику.
У проекті можна використовувати всі три способи, вони підтримуються і компілятором, і компоновщиком, але не слід експортувати одну функцію більш ніж одним способом. Наприклад, припустимо, що бібліотека DLL містить два модулі вихідного коду, C і C ++, які містять дві функції для експорту - my_C_export і my_Cpp_export відповідно. Для простоти припустимо, що функції приймають один числовий аргумент подвійної точності і повертають дані того ж типу. У наступних розділах описуються варіанти експорту функцій за допомогою кожного з цих методів.
За допомогою DEF-файлу
Зверніть увагу, що функція C декорована, але в DEF-файлі компонувальнику явно дано вказівку надавати цю функцію, використовуючи ім'я з вихідного коду (в даному прикладі). Компоновщик неявно експортує функцію C ++, використовуючи ім'я вихідного коду, так що в DEF-файл необов'язково включати розширене ім'я.
Угода для викликів функцій API 32-розрядної Windows передбачає наступне декорування функцій C: function_name стає _ function_name @ n. де n - кількість байтів, виражене у вигляді десяткового числа, прийнятого всіма аргументами, при цьому кількість байтів для кожного округляється до найближчого числа, кратного чотирьом.
Розмір всіх покажчиків в Win32 - чотири байти. Тип значення, що повертається не впливає на декорування імені.