Конференция "Базы" » IB API [D5, Firebird 2.0]
 
  • Olegus (13.07.08 17:41) [0]
    Добрый всем день. Есть функция
    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)". Что я упустил?
  • Сергей М. © (13.07.08 21:55) [1]
    Скоре всего, -  соглашение о вызове.

    А к чему все это БДСМ ?)
  • PEAKTOP © (14.07.08 01:34) [2]
    > Всё это в длл.

    А так ?


    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);

  • PEAKTOP © (14.07.08 01:35) [3]
    > TR_Handle := StartTransaction(teb);

    это убрать.
  • Olegus (14.07.08 12:19) [4]
    #PEAKTOP ©
    большое спасибо, но теперь ошибку даёт -
    ReallocMem(Pointer(P), NewSize);

 
Конференция "Базы" » IB API [D5, Firebird 2.0]
Есть новые Нет новых   [134434   +28][b:0][p:0.001]