-
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]Скоре всего, - соглашение о вызове.
А к чему все это БДСМ ?) -
> Всё это в длл.
А так ?
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); -
> TR_Handle := StartTransaction(teb);
это убрать. -
Olegus (14.07.08 12:19) [4]#PEAKTOP ©
большое спасибо, но теперь ошибку даёт -ReallocMem(Pointer(P), NewSize);