Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IB API [D5, Firebird 2.0]


Olegus ©   (2008-07-13 17:41:00) 

Добрый всем день. Есть функция
function StartTransaction(const teb: array of isc_teb) : isc_tr_handle;
var
 status : status_vector;
 IBerrCode : isc_status;
begin
 IBerrCode := isc_start_multiple(@status, @result, high(teb) + 1, @teb);
 if IBerrCode <> 0 then HandleIBErrors(@status);
end;

в юните который экпортируется из длл имею


type
 isc_tr_handle = pointer;
 isc_teb = record
   db_ptr: pisc_db_handle;
   tpb_len: longint;
   tpb_ptr: pchar;
 end;

var teb : isc_teb;
    TR_Handle : isc_tr_handle;
....
begin
.....
TR_Handle := nil;
 teb.db_ptr := DB_Handle;
 teb.tpb_len := 0;
 teb.tpb_ptr := nil;
 TR_Handle := StartTransaction(teb);

Всё это в длл. Из главной программы получаю DB_Handle (хэндл вроде нормальный).
При выполнении StartTransaction выдаёт "invalid transaction handle (expecting explicit transaction start)". Что я упустил?


Olegus   (2008-07-14 12:19:00) [1]

#PEAKTOP ©
большое спасибо, но теперь ошибку даёт - ReallocMem(Pointer(P), NewSize);


PEAKTOP   (2008-07-14 01:35:00) [2]

> TR_Handle := StartTransaction(teb);

это убрать.


PEAKTOP   (2008-07-14 01:34:00) [3]

> Всё это в длл.

А так ?


type
 ULONG = LongInt;

 TISC_TEB  = record
   db_handle      : PISC_DB_HANDLE;
   tpb_length     : ULONG;
   tpb_address    : PChar;
 end;
 PISC_TEB = ^TISC_TEB;

procedure FBAlloc(var P; OldSize, NewSize: Integer);
var
 i :Integer;
begin
 if((not Assigned(Pointer(P))) or (Pointer(P) = nil))then
   GetMem(Pointer(P), NewSize)
  else
   ReallocMem(Pointer(P), NewSize);
 for i:=OldSize to NewSize-1 do
   PChar(P)[i] := #0;
end;

.............

var PTEB : PISC_TEB;
   TR_Handle : isc_tr_handle;
....
begin
.....
 TR_Handle := nil;

 FBAlloc(PTEB, 0, SizeOf(TISC_TEB));

 PTEB^.db_ptr := DB_Handle;
 PTEB^.tpb_len := 0;
 PTEB^.tpb_ptr := nil;
 TR_Handle := StartTransaction(teb);

 if (isc_start_multiple(@status, TR_Handle, 1, PTEB) <> 0)then
   begin
   HandleIBErrors(@status)
   end

 .............
 FreeMem(PTEB);


Сергей М.   (2008-07-13 21:55:00) [4]

Скоре всего, -  соглашение о вызове.

А к чему все это БДСМ ?)


Наверх

Титульная страница Поиск, карта сайта Написать письмо