Вот решил попытать счастья и вытащить базу из справочника. Опыта особого нет, но механизм в целом понятен.
Собственно жертва!
[Ссылки могут видеть только зарегистрированные пользователи. ]
Увидев файлы базы, подумал что всё пройдёт гладко. Но после тщетных попыток понять с чем же мы имеем дело, оказалось что это не стандартная база, а какое-то извращение своё.
Прога написана на Делфи. Был скачан DeDe, но жизни он не облегчил особо. Запустив под Олькой обнаружил, что с базой работают три библиотеки
dread.dll
xfind.dll
udata.dll
С первой проще! Быстренько написал софтинку (PureBasic) для чтения .dat файлыов с её помощью, и получить даже количество записей в каждой из БД.
Но вот дошел до функции dreadrecord, а она возвращает два загадочных параметра. Которые как я подозреваю являются адресом и размером для чтения. Вот только адресом чего и откуда читать потом
Код:
EnableExplicit
;{
DataSection
DB_KEY:
Data.b $44,$65,$43,$35,$31,$36,$37,$35,$30,$33,$32,$37,$37,$64,$56,$66,$0B,$01,$00
EndDataSection
Prototype p_dloadfile(Fname$,*File)
Prototype p_drecordcount(File,*Count)
Prototype p_dreadrecord(File,Index,*Addr,*Count)
Prototype p_drcsetmasterkey(*Key)
Prototype p_dunloadfile(File)
Prototype p_xloadfile(Fname$)
Prototype p_xfind_cb(*FirstP,Flag,*EP,*NextP)
Define FLib=OpenLibrary(#PB_Any, "dread.dll")
If FLib
Global dloadfile.p_dloadfile = GetFunction(FLib, "dloadfile")
Global drecordcount.p_drecordcount = GetFunction(FLib, "drecordcount")
Global dreadrecord.p_dreadrecord = GetFunction(FLib, "dreadrecord")
Global drcsetmasterkey.p_drcsetmasterkey = GetFunction(FLib, "drcsetmasterkey")
Global dunloadfile.p_dunloadfile = GetFunction(FLib, "dunloadfile")
EndIf
Define FLib=OpenLibrary(#PB_Any, "xfind.dll")
If FLib
Global xloadfile.p_xloadfile = GetFunction(FLib, "xloadfile")
Global xfind_cb.p_xfind_cb = GetFunction(FLib, "xfind_cb")
EndIf
Structure REC
RID.i
Count.i
EndStructure
Structure DBF
File.i
Count.i
Array Record.REC(0)
EndStructure
;}
Global NewList DBF.DBF()
Procedure ReadFileDB(FName$)
Protected File,Count,I,RID,RCount
Protected *lBuff,*wBuff
If dloadfile(FName$,@File)=#S_OK
AddElement(DBF())
DBF()\File=File
If drecordcount(File,@Count)=#S_OK
DBF()\Count=Count
ReDim DBF()\Record(Count)
For I= 1 To Count
If dreadrecord(File,I,@RID,@RCount)=#S_OK
With DBF()\Record(I-1)
\RID=RID
\Count=RCount
EndWith
EndIf
Next
EndIf
ProcedureReturn File
EndIf
EndProcedure
#FPath="C:\Program Files\Kontakt! 2012\Products\Kontakt! 2012\"
ReadFileDB(#FPath+"prod.dat")
ReadFileDB(#FPath+"prod.dat")
ReadFileDB(#FPath+"Kontakt\init.dat")
drcsetmasterkey(?DB_KEY)
ReadFileDB(#FPath+"Kontakt\comp1.dat")
ReadFileDB(#FPath+"Kontakt\comf1.dat")
ReadFileDB(#FPath+"Kontakt\head1.dat")
ReadFileDB(#FPath+"Kontakt\regi1.dat")
ReadFileDB(#FPath+"Kontakt\sadd1.dat")
ReadFileDB(#FPath+"Kontakt\banner1.dat")
ReadFileDB(#FPath+"Kontakt\reno1.dat")
ReadFileDB(#FPath+"Kontakt\ext01.dat")
ReadFileDB(#FPath+"Kontakt\ext11.dat")
ReadFileDB(#FPath+"Kontakt\ext21.dat")
Дальше веселее. По размеру файла idxs1.idx, понял что вся вкусность храниться в нём, а dat - это лишь заглавные файлы хранящие инфо о полях в нём. И для работы с ним есть либа xfind.dll, эта гадость линкуется в процессе уже.
На ней и застрял. Если правильно уловил параметры в ольке, то вызывается изначально
Код:
xloadfile(#FPath+"Kontakt\idxs1.idx")
Но что за щятафака? Возвращает она S_OK, если файл норм, и код ошибки если нет, а где же указатель на прочтённый файл или что-то в этом роде? Выделения памяти библиотекой тоже не заметил.
Поиск по БД если снова таки правильно понял, то осуществляется с помощью xfind_cb. Пока, это всё, что удалось нарыть.
Помогите совместить полезное с приятным. Решить проблему и за одно освоить сие направление, чтобы в дальнейшем я не задавал такие вопросы а смог сам пройти этот путь