Указатель на функцию, ипортируемую из 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);