BD> Возможно ли поменять Driver файла во время выполнения?
BD> FileXXX{PROP:Driver} =
BD> Почему то не помогает.
Нет, легально не получится. Свойство PROP:Driver ТОЛЬКО возвращает наименование драйвера для данного файла. Но не меняет его.
В принципе, есть два варианта:
- использовать библиотеки третьих разработчиков, например, что-то типа MetaDriver.
Там это сделано через подстановку в качестве драйвера своей «пустышки». А уже в пустышке» они перенаправляют запрос нужному драйверу. - делать это самому, просто меняя в заголовке файла адрес точки входа в нужный драйвер.
Второй вариант, имхо, более предпочтителен. Хотя-бы потому, что использует ТОЛЬКО ЛЕГАЛЬНЫЕ средства самого Клариона.
Нет необходимости в подключении самописных драйверов, которые, к тому-же, необходимо корректировать в зависимости от версии Клриона.
Точный код реализации приводить не буду.
Приведу лишь алгоритм — тот кто понимает, сможет его реализовать на любой версии Клариона.
Если тема будет интересна многим, могу более подробно ее «развернуть» в письме.
TPS_Driver BYTE,EXTERNAL,DLL(dll_mode),NAME('TOPSPEED')
DAT_Driver BYTE,EXTERNAL,DLL(dll_mode),NAME('CLARION')
BTR_Driver BYTE,EXTERNAL,DLL(dll_mode),NAME('BTRIEVE')
SQL_Driver BYTE,EXTERNAL,DLL(dll_mode),NAME('MSSQL')
ODBC_Driver BYTE,EXTERNAL,DLL(dll_mode),NAME('ODBC')
MyFile FILE,DRIVER('TOPSPEED'),PRE(FIL),NAME(GLO:FName),CREATE
...
END
...
FHeaderAddr# = Address(MyFile)! Адрес заголовка файла
DrvAddr# = Address(DAT_Driver)! Адрес точки входа драйвера 'CLARION'
POKE(FHeaderAddr#,DrvAddr#) ! Замена драйвера для файла MyFile
GLO:FName = ...
Create(MyFile) ! Создаем DAT-файл заданной структуры
... ! Работаем с этим файлом
Close(MyFile)
DrvAddr# = Address(BTR_Driver)! Адрес точки входа драйвера 'BTRIEVE'
POKE(FHeaderAddr#,DrvAddr#) ! Замена драйвера для файла MyFile
GLO:FName = ...
Create(MyFile) ! Создаем BTRIEVE-файл заданной структуры
... ! Работаем с этим файлом
Close(MyFile)
В версиях до C55 этого достаточно.
В С55 желательно (даже обязательно!) после закрытия файла или
ПЕРЕД сменой драйвера вызвать:
MAP
MODULE('Clarion RTL')
DeActivate_Drv(FILE _File),NAME('Cla$deactivate_drv'),DLL(dll_mode)
END
END
...
DeActivate_Drv(MyFile)
В С60 можно делать то-же самое или использовать новую функцию, которую SV вывели на верхний уровень, DESTROY(MyFile).
P.S.
Кстати, если не секрет — зачем это?
Что-то с трудом могу себе представить реальную задачу, в которой это могло-бы потребоваться. Если только для конвертора из одного формата в другой?
