![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AccessViolation непонятно с чего [D6, WinXP]
Alexandr3 © (2005-03-10 08:49:00)Ниже привожу код в котором при закоментировании строки
Element[5]:= 'First_Name'; все проходит при раскоментированной строке отладчик выдает сабж уже на строке
@htinit := GetProcAddress(LibHandle,'HTINIT');
Помогите пожалуйста
Воообще если кто работал с HyTech Базами буду благодарен за небольшой пример создания таблицы.
var
Element:TElement;
httablecreate:Function(ptablename:Pchar;fpelement:TElement ;nElems:integer;fpCryptoKey:Pchar;fpReadPswd:Pchar;fpWritePswd:Pchar;nOpenMode:integer;fpHandle:THandle):integer;
htshut:function():integer;
gh:integer;
Form1: TForm1;
LibHandle:Thandle;
htinit:function(LangRus: pointer;rrr:Integer): integer;
implementation
uses htdefs;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
LibHandle:=LoadLibrary('HTW32PAS.DLL') ;
@htinit := GetProcAddress(LibHandle,'HTINIT');
@htTableCreate := GetProcAddress(LibHandle,'HTTABLECREATE');
htinit(nil,20) ;
Element[0]:=10;
Element[1]:=0;
Element[2]:= EC_FIELD;
Element[3]:=ET_CHAR;
Element[4]:=EK_NOTKEY;
Element[5]:= 'First_Name';
//htTablecreate('c:\rtr',Element,1,'paswd',nil,nil,128,gh) ;
Edit1.Text:='dfva';
MU (2005-03-10 09:50:00) [21]кажется, TElement надо объявить как record
Alexandr3 (2005-03-10 09:31:00) [22]Честно говоря не совсем понял вопрос учитывая что в данном случае
httablecreate не вызывается (закоментированна )
а при закоментированной
Element[5]:= 'First_Name
адрес функции httablecreate возвращается нормально
Ниже описание функции из документации и еще
TElement oбъявлен как
type TElement=array[0..5] of variant;
htTableCreate - Создать новую таблицу
Назначение:
Функция служит для создания новой таблицы. Если таблица с заданным именем уже существует, поведение функции зависит от флага TAB_CREATE . Для сброшенного флага операция завершится с ошибкой. Если флаг установлен, функция уничтожит старую таблицу и создаст новую.
При создании или открытии СУБД присваивает таблице некий номер - "обработчик". Этот номер будет идентифицировать таблицу при последующих операциях поиска или обработки данных. При создании или открытии таблицы нужно указать флаги доступа, задающие режим использования таблицы (монопольный или совместный), возможность модификации данных и пр.
При задании ключа крипто-закрытия выполняется шифрование данных как в постоянной части таблицы, так и журнале изменений. Также шифруется часть ассоциатора, содержащая индексы ключевых полей. При шифровании применятся алгоритм, использующий заданный пароль, что ограничивает доступ к данным лиц, имеющих те же программные средства, но не знающих пароль закрытия. Кроме шифрования данных возможно закрыть доступа к таблице паролем для чтения (поиска) или модификации. Последующие операции чтения (поиска) таблицы возможны только при указании пароля доступа на чтение. А операции модификации - еще и пароля доступа на запись.
Прототип:
int HTAPI htTableCreate(
char far *fpTableName, /* Имя таблицы (можно без расширения) */
LPELEMENT fpElems, /* Описатели элементов таблицы */
int nElemCnt, /* Число описателей элементов */
char far *fpCryptoKey, /* Ключ для крипто-закрытия данных */
char far *fpReadPswd, /* Пароль для доступа на чтение */
char far *fpWritePswd, /* Пароль для доступа на запись */
int nOpenMode, /* Режим открытия (константы TAB_???? ) */
LPTHANDLE fpHandle /* Для приема обработчика таблицы */
);
Параметры:
fpTableName
имя файла описания таблицы (с указанием полного или частичного пути), расширение задавать не обязательно
fpElems
задает адрес массива описателей элементов таблицы. Описания производных элементов записи (группы и подстроки) должны располагаться после описания полей. В поле таких элементов указывается:
wOffset
порядковый номер (отсчет от 1) первого поля таблицы, входящего в группу или образующего подстроку
wLength
для группы указывается число смежных полей, образующих группу. Для подстроки содержит смещение подстроки относительно начала образующего поля (отсчет от 1)
cType
Длина подстроки (тип подстроки может быть только ET_CHAR).
nElemCnt
задает число элементов таблицы (размерность массива описателей).
fpCryptoKey
задает строку, используемую в качестве пароля для крипто-закрытия данных. Значащими являются только первые 8 символов. Если пароль не нужен, можно задать NULL или пустую строку "".
fpReadPswd
задает строку, используемую в качестве пароля для доступа к таблице на чтение. Значащими являются только первые 8 символов. Если пароль не нужен, можно задать NULL или пустую строку "".
fpWritePswd
задает строку, используемую в качестве пароля для доступа к таблице на запись. Значащими являются только первые 8 символов. Если пароль не нужен, можно задать NULL или пустую строку "".
nOpenMode
задает флаги открытия ( TAB_??? )
fpHandle
задает адрес переменной для занесения обработчика создаваемой таблицы.
Результат:
0 при успешном завершении
отрицательное число код ошибки
Пример.
Создать таблицу из четырех полей с шифрованием данных и свободным доступом на чтение/запись для локального использования. Кроме полей, таблица будет содержать группу (ключ, объединяющий первые два поля) и подстроку (ключ, состоящий из части второго поля).
/* При создании таблицы смещение полей рассчитывает СУБД */
/* Длина поля имеет смысл только для символьных полей */
ELEMENT asElem[] = {
{ 10, 0, EC_FIELD, ET_CHAR, EK_NOTKEY, "Frst_Name" },
{ 10, 0, EC_FIELD, ET_CHAR, EK_NOTKEY, "Scnd_Name" },
{ 0, 0, EC_FIELD, ET_BYTE, EK_NOTKEY, "Sex" },
{ 0, 0, EC_FIELD, ET_WORD, EK_NOTKEY, "Salary" },
/* Группа, включающая первое и второе имя, образующая ключ */
{ 2, 1, EC_GROUP, ET_CHAR, EK_COMMON, "Name" },
/* Подстрока от второго имени, состоящая из первых пяти символов */
{ 1, 2, EC_SUBSTR, 5, EK_COMMON, "Substr" }
};
THANDLE hNew;
int rc;
rc = htTableCreate( "staff", asElem, sizeof(asElem) / sizeof(ELEMENT),
"password", NULL, NULL, TAB_PRIVATE, &hNew );
if( rc < 0 )
/* Обработка ошибок */
Anatoly Podgoretsky (2005-03-10 09:10:00) [23]А где объявление httablecreate в библиотеке, хочешь, чтобы мы помедитировали?