Реферат: Создание в среде 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;

К-во Просмотров: 492
Бесплатно скачать Реферат: Создание в среде Borland C++ Builder dll, совместимой с Visual C++