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



>   success=false;

>  }

>  GetMemSize=(MemSizeFun)::GetProcAddress(InterDll,"GetMemSize");

>  if (GetMemSize==NULL) {

>   //Не удалось импортировать функцию AfxMessageBox("Couldn't get an adress for GetMemSize function from library XDSPInter.dll", MB_ICONERROR | MB_OK);

>   success=false;

>  }

>  IsDriverPresent=(IsDrivFun)::GetProcAddress(InterDll,"IsDriverPresent");

>  if (IsDriverPresent==NULL) {

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

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

>   success=false;

>  }

> }

> return(success);

>}

Вызов метода ConnectToDriver() целесообразно сделать в конструкторе класса. Там же надо реализовать и проверку, присутствует ли в системе драйвер. Тогда вся необходимая инициализация будет проведена еще при запуске приложения.

>CXDSPView::CXDSPView() : CFormView(CXDSPView::IDD) {

> //{{AFX_DATA_INIT(CXDSPView)

> //}}AFX_DATA_INIT

> //Здесь мы добавляем свой код. Success – переменная экземпляра. Если она

> //равна true – то ошибок нет, иначе произошла какая-то ошибка.

> success=true;

> //Пробуем подключить dll:

> if (ConnectToDriver()) {

>  //Удалось подключить библиотеку. Теперь пытаемся установить связь с

>  //драйвером – вызываем функцию в dll:

>  if (!IsDrvPresent()) {

>   //Неудача

>   success=false;

>   AfxMessageBox("Necessary driver isn't present in the system",MB_ICONERROR | MB_OK);

>  }

> } else

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

>  success=false;

>}

Метод, производящий чтение памяти устройства может выглядеть следующим образом:

>void CXDSPView::OnRead() {

> int res; //Количество слов, прочитанных из памяти

>res=(*ReadMem)(dt,256); //Пытаемся читать 256 слов.

> m_buff.SetWindowText(dt); //Выводим данные на экран

> //Код, характерный для VC++.

> CXDSPDoc *m_doc; //Подключаем документ, связанный с представлением

> m_doc=GetDocument();

> //копируем туда данные.

> strcpy((char*)m_doc->m_buffer,dt);

> //Примечание: оба буфера должны иметь достаточный объем – минимум

> //256*4+1 байт.

>}

Аналогично может выглядеть метод записи в память устройство:

>void CXDSPView::OnWrite() {

> //Получили данные, введенный пользователем

> m_buff.GetWindowText(dt,32767);

> int res;

> //Записываем его в память устройства. Заметим, что в качестве длины данных

> //мы передаем не длину в байтах, а в 4-байтых словах.

> res=(*WriteMem)(dt,strlen(dt)%4+1);

>}

Метод, возвращающий длину памяти устройства, совсем прост и, думаю, в комментариях не нуждается.

>int CXDSPView::GetTotalLen() {