1

TIBControlAndQueryServiceGetNextLine の呼び出し時に isc_info_svc_timeout (1 秒) オプションを追加したいと考えています。IBServices をコピーして変更し、ServiceStartAddParam (Value: Integer; param: Integer) と同様の方法で isc_info_svc_line の後に isc_info_svc_timeout を ServiceQueryParams に追加しましたが、「機能がサポートされていません」というエラー メッセージが表示されます。

編集

まず、GetNextLine ではなく InternalServiceQuery にタイムアウトを追加することにしました。次に、タイムアウト パラメータを FQueryParams に追加してはいけませんでした。3 番目のタイムアウト パラメータには、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
4

0 に答える 0