Разработка драйверов t11 и t12 возможна с использованием практически любого компилятора, который может корректно создавать WIN32 DLL библиотеки. При этом нужно учитывать следующие моменты:
Соглашение о вызове. Функции, экспортируемые драйвером, должны быть объявлены как __cdecl.
Функции в DLL описания протокола драйвера должны иметь совершенно определенные порядковые номера (ordinals). При этом их имена могут быть произвольными. Драйверы t11 и t12 используют для однотипных функций разные порядковые номера (ordinals).
Пример DEF-файла для типа 11:
; type 11
EXPORTS
Check_xxx @1
Get_xxx @2
Prepare_xxx @3
Set_xxx @4
zCompare_xxx @5
zReadAny_xxx @6
DllMain @7
Пример DEF-файла для типа 12:
;type 12
EXPORTS
Check_yyy @1
Close_yyy @2
Get_yyy @3
Open_yyy @4
Set_yyy @5
zCompare_yyy @6
DllMain @7
Таким образом, экспортируемые функции должны быть расположены в алфавитном порядке.
Компилятор Borland C++ Builder 6.0 неправильно обрабатывает DEF-файлы. Добиться присвоения нужных ordinals удается только в том случае, если определения функций расположены в алфавитном порядке в исходном файле.
DLL описания интерфейса (media<n>.dll) также экспортирует функции по номерам, в алфавитном порядке.
Пример исходного текста для модуля описания носителя на Borland C++ Builder
//////////////////// #include <windows.h> #include <stdio.h>
int __export CloseMedia(long &hndl) {return 0;}
int __export OpenMedia(long &hndl) { hndl = 1; return 0; }
int __export ReadMedia(long &hndl, char *rbuf, int in_count, int &actual_count) {return 0;}
int __export StartMedia(long &hndl) {return 0;}
int __export StopMedia(long &hndl) {return 0;}
int __export WriteMedia(long &hndl, char *sbuf, int out_count, int &actual_count) {return 0;}
//////////////// #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) {return TRUE;} //////////////// |