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.
Кстати, если не секрет — зачем это?
Что-то с трудом могу себе представить реальную задачу, в которой это могло-бы потребоваться. Если только для конвертора из одного формата в другой?