Реферат: Создание в среде Borland C++ Builder dll, совместимой с Visual C++
Ключевое слово __declspec с атрибутом dllexport помечает функцию как экспортируемую, имя функции добавляется в таблицу экспорта dll. Таблица экспорта любого PE-файла (.exe или .dll) состоит из трех массивов: массива имен функций (а точнее, массива указателей на строки, содержащие имена функций), массива порядковых номеров функций и массива относительных виртуальных адресов (RVA) функций. Массив имен функций упорядочен в алфавитном порядке, ему соответствует массив порядковых номеров функций. Порядковый номер после некоторых преобразований превращается в индекс элемента из массива относительных виртуальных адресов функций. При экспорте функции по имени имеет место следующая последовательность действий: по известному имени функции определяется ее индекс в массиве имен функций, далее по полученному индексу из массива порядковых номеров определяется порядковый номер функции, затем из порядкового номера, с учетом базового порядкового номера экспорта функций для данного PE-файла, вычисляется индекс, по которому из массива адресов извлекается искомый RVA функции. Помимо экспорта по имени возможен экспорт функций по их порядковым номерам (ordinal). В этом случае последовательность действий для получения индекса элемента из массива относительных виртуальных адресов сводится только к преобразованию порядкового номера функции. Для экспорта функций по номеру используется .def-файл с секцией EXPORTS, где за каждой функцией будет закреплен порядковый номер. При этом в тексте самой dll функции как экспортируемые не помечаются. Подробнее о таблице экспорта можно прочитать в статье по адресу http://www.rsdn.ru/article/baseserv/pe_coff.xml.
ExplicitDll.cpp
#include <vcl.h> #include <grids.hpp> #include "ExplicitDll.h" int __cdecl SumFunc(int a, int b) { return a + b; } HWND __stdcall ViewStringGridWnd(int Count, double* Values) { try { // создаем VCL-форму, на которой будет отображен StringGrid, // и задаем ее основные параметры TForm* GridForm = new TForm((TComponent *)NULL); GridForm->Caption = "Grid Form"; GridForm->Width = 300; GridForm->Height = 300; // создаем компонент StringGrid и устанавливаем его размеры TStringGrid *Grid = new TStringGrid(GridForm); Grid->ColCount = Count + 1; Grid->RowCount = Count + 1; // заполняем StringGrid значениями if (Values != NULL) for (int i = 0; i < Count; i++) Grid->Cells[i + 1][i + 1] = Values[i]; // задаем параметры отображения StringGrid в родительском окне Grid->Parent = GridForm; К-во Просмотров: 493
Бесплатно скачать Реферат: Создание в среде Borland C++ Builder dll, совместимой с Visual C++
|