Использование NuMega DriverStudio для написания WDM-драйверов | страница 42



Указатель на функцию, ипортируемую из dll-библиотеки должен также быть скомпилирован со специальным объявлением типа — __declspec(dllimport). Эту строку также удобно представить в виде директивы #define.

>#define XDSPINTER_API __declspec(dllimport).

Мы импортируем из библиотеки четыре функции, поэтому необходимо определить их типы: параметры, передаваемые в функцию, возвращаемое значение. Это можно сделать при помощи директивы typedef:

>//Объявить тип - указатель на функцию, возвращающую значение типа int и принимающую два

>//параметра – массив типа char и число int. В библиотеке ей будет соответствовать функция

>// EXPORT int ReadMem(char *data, int len)

>typedef XDSPINTER_API int (*MemReadFun)(char *data, int len);

>// EXPORT int WriteMem(char *data, int len)

>typedef XDSPINTER_API int (*MemWrtFun)(char *data, int len);

>// EXPORT int GetMemSize(void)

>typedef XDSPINTER_API int (*MemSizeFun)();

>//EXPORT bool IsDriverPresent(void)

>typedef XDSPINTER_API bool (*IsDrivFun)();

Теперь пришло время создать сами указатели на функции:

>MemReadFun ReadMem;

>MemWrtFun WriteMem;

>MemSizeFun GetMemSize;

>IsDrivFun IsDriverPresent;

Теперь рассмотрим функцию, подключающую dll-библиотеку к приложению. Она будет подключать dll-библиотеку к приложению и пытаться установить связь с драйвером. Функция вернет true в случае успеха и false при неудаче. Т.к. VC++ — объектно-ориентированная среда, то эта функция будет методом одного из классов приложения (в нашем случае — класса представления).

>bool CXDSPView::ConnectToDriver() {

> //Переменная, в которой будет храниться возвращаемое значение.

> success=true;

> //HMODULE InterDll – переменная экземпляра, где хранится хэндл библиотеки.

> InterDll=::LoadLibrary("XDSPInter");

> if (InterDll==NULL) {

>  //Не удалось подключиться к библиотеке

>  AfxMessageBox("Couldn't load a library XDSPInter.dll",MB_ICONERROR | MB_OK);

>  //Вернем неудачу.

>  success=false;

> } else {

>  //Библиотека подключена успешно. Импортируем функции.

>  ReadMem=(MemReadFun)::GetProcAddress(InterDll,"ReadMem");

>  if (ReadMem==NULL) {

>   //Не удалось импортировать функцию

>   AfxMessageBox("Couldn't get adress for ReadMem function from library XDSPInter.dll", MB_ICONERROR | MB_OK);

>   success=false;

>  }

>  WriteMem=(MemReadFun)::GetProcAddress(InterDll,"WriteMem");

>  if (WriteMem==NULL) {

>   //Не удалось импортировать функцию

>   AfxMessageBox("Couldn't get an adress for WriteMem function from library XDSPInter.dll", MB_ICONERROR | MB_OK);