我想在调用TIBControlAndQueryServiceGetNextLine时添加isc_info_svc_timeout(1秒)选项。我复制并修改了IBServices,以类似的方式将isc_info_svc_line附加到ServiceQueryParams之后,例如ServiceStartAddParam(Value:Integer; param:Integer),但我得到错误消息“功能不受支持”
修改
首先,我决定向InternalServiceQuery添加超时而不是GetNextLine。其次,我将超时参数附加到FQueryParams,我不应该这样做。第三,超时参数在isc_service_query函数中有自己的位置,4和5位置(数据和数据指针的长度)。现在它看起来像它的工作,我的意思是没有“功能不支持”错误但不幸的是它没有。调用GetNextLine(调用InternalServiceQuery)后,当没有数据要发回时,我的应用挂起并等待数据,就像超时参数没有效果一样。
procedure TIBCustomService.InternalServiceQuery;
function AddParam (Value: Integer; param: Integer): string;
begin
Result := Char(Param) +
PChar(@Value)[0] +
PChar(@Value)[1] +
PChar(@Value)[2] +
PChar(@Value)[3];
end;
var
FTimeout: string;
PTimeout: PChar;
FTimeoutLen: short;
begin
FTimeout := AddParam(1, isc_info_svc_timeout);
FTimeoutLen := Length(FTimeout);
PTimeout := nil;
IBAlloc(PTimeout, 0, FTimeoutLen);
Move(FTimeout[1], PTimeout[0], FTimeoutLen);
FQuerySPBLength := Length(FQueryParams);
if FQuerySPBLength = 0 then
IBError(ibxeQueryParamsError, [nil]);
IBAlloc(FQuerySPB, 0, FQuerySPBLength);
Move(FQueryParams[1], FQuerySPB[0], FQuerySPBLength);
if (FOutputBuffer = nil) then
IBAlloc(FOutputBuffer, 0, FBufferSize);
try
if call(FGDSLibrary.isc_service_query(StatusVector, @FHandle, nil,
FTimeoutLen, PTimeout,
FQuerySPBLength, FQuerySPB,
FBufferSize, FOutputBuffer), False) > 0 then
begin