В каждой DLL существует таблица: | адр. | hint | имя процедуры |, т.е. существует список экспортированных функций в виде таблицы, где:
адр. – адрес реализации функции в адресном пространстве. Вычисляется путем + базового адреса загрузки DLL со смещением внутри DLL.
hint – служит для оптимизации поиска функций
имя процедуры – текстовая строка
«объявление функции»
__stdcall__declspec(__dllimport)int Func(…);
extern “C”
__import
При создании динамической библиотеки создается также LIB –файл со списком экспортируемых функций. Его надо подключить в проект. Внутри него существует таблица функций. Чтобы использовать функцию из DLL надо объявить ее при помощи «объявление функции», как правило, в заголовочном файле. В качестве альтернативы можно использовать __import или ключевое слово extern “C”. Для обращения к функциям DLL, загруженной при помощи LoadLibrary, используется следующий механизм:
— Определяется указатель на функцию, параметры возвращаемых значений которой соответствуют используемым в DLL.
— Используется функция
FARPROC GetProcAddress(
HINSTANCE hDLL,
LPCSTR ProcName);
или
FARPROC GetProcAddress(
HINSTANCE hDLL,
int Number);
xx=GetProcAdress(hDll, MAKEINTRESOURCE(r)); не рекомендуется
xx(Param 1, Param 2);
Пример создания DLL:
// MyDll.cpp
double dblValue(double);
double halfValue(double);
extern “C”_declspec(__dllexport)double
ChangeValue(double,bool);
double dblValue(double, Value){return Value*Value}
double halfValue(double, Value){return Value*12.0}
double ChangeValue(double Value, bool opt) {return opt ? dblValue(Value): halfValue(Value);}}
//MyDll.h
#ifdef __BUILD_THE_DLL
#define __EXPORT_TYPE __export
#else
#define __EXPORT_TYPE __import
#endif
double EXPORTTYPE ChangeValue(double,bool);
Пример работы с кучами:
//heapEx.h
class HeapExample
{ static Hheap heap;
static UINT num_alloc_in_heap; // количество узлов кучи
…….
public:
void* operator new (size_t size);
void* operator delete(void* p);
…….
};
//heapEx.cpp
Hheap HeapExample::heap = NULL;
UINT HeapExample::num_alloc_in_heap =0;
void* HeapExample::operator new(size_t size)
{
if (heap)
{
heap = HeapCreate (HEAP_NO_SERIALIZE,0,0);
if (!heap) return NULL;
}
void p*;
while(!(p=(void*)HeapAlloc(heap,o,size))
{
if(_new_handler)(*_newhandler)();
else break;
}
if (p)
num_alloc_in_heap++;
return p;
}
}
void HeapExample::operator delete(void *p)
{
if(HeapFree(heap,0,p))
num_alloc_in_heap—;
if (!num_alloc_in_heap)
if(HeapDestroy(heap))
Heap=NULL;
}
