Ante todo buenas tardes.
Tengo un problema con un servicio, a ver si me pueden echar un cable.
Es problema es el siguiente:
E creado un servicio para un lector de tarjetas, cuando se inserta la tarjeta el servicio procede a ejecutar la acción que le corresponde.
Hasta aquí bien, el problema biene cuando intento abrir el database, trabajo con Interbase.
Si lo hago con el programa directamente, funciona bien. Cuando es un servício da error.
No sé si me he explicado, si pudieran ayudarme se lo agradecería.
Les pongo el código que tengo:
Código Delphi
[-]
unit uControlAAI;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
PCSCConnector, IBSQL, IBDatabase, DB, Registry, IBQuery;
type
TTarjetaAAI = class(TService)
pcsc: TPCSCConnector;
Database: TIBDatabase;
Transaction: TIBTransaction;
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
procedure pcscCardInserted(Sender: TObject);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServiceShutdown(Sender: TService);
private
Accion : Word;
procedure ConexionBaseDatos;
public
function GetServiceController: TServiceController; override;
end;
var
TarjetaAAI: TTarjetaAAI;
implementation
uses uCodigoBarras;
{$R *.DFM}
procedure TTarjetaAAI.ConexionBaseDatos;
var
Reg : TRegistry;
Clave : String;
i : Integer;
Direccion : String;
begin
Clave := '\Software\AAI\A-F@ctu';
Reg := TRegistry.Create;
Try
Reg.RootKey := HKey_Local_Machine;
Reg.OpenKey(Clave, True);
Direccion := Reg.ReadString('BDatos');
Finally
Reg.CloseKey;
Reg.Free;
End;
Database.DataBaseName := Direccion;
Try
Database.Open; Beep;
Except
DataBaseError('Error Database');
End;
Transaction.Active := True;
end;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
TarjetaAAI.Controller(CtrlCode);
end;
function TTarjetaAAI.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TTarjetaAAI.ServiceCreate(Sender: TObject);
Begin
pcsc.Init;
pcsc.UseReaderNum := 0;
If not pcsc.Open then
ShowMessage('Error Abrir');
If not pcsc.Connect then
ShowMessage('Error Conectar');
end;
procedure TTarjetaAAI.ServiceDestroy(Sender: TObject);
begin
pcsc.Close;
pcsc.Disconnect;
end;
procedure TTarjetaAAI.pcscCardInserted(Sender: TObject);
var
data, cadena : string;
sw : array[0..1] of byte;
ISQL : TIBSQL;
Query : TIBQuery;
begin
If not pcsc.Connect then
pcsc.Connect;
pcsc.GetResponseFromCard(Hex2Bin('00B00020' + Format('%0.2x', [16])), data, sw[0], sw[1]);
cadena := TrimRight(copy(data, 1, 6));
If cadena <> '' then begin
If Not Database.TestConnected then
ConexionBaseDatos;
Query := TIBQuery.Create(Nil);
Query.Database := Database;
Query.SQL.Text := 'Select ID_ENTRADAS_TAR from ENTRADAS_TAR where CODIGO_VENDEDOR = :Vendedor and FECHA_SALIDA is null';
Query.Open;
ISQL := TIBSQL.Create(Nil);
ISQL.Database := Database;
ISQL.Transaction := Transaction;
If Query.IsEmpty then begin
ISQL.SQL.Text := 'insert into ENTRADAS_TAR (FECHA_ENTRADA, HORA_ENTRADA, CODIGO_VENDEDOR) values (:FECHA_ENTRADA, :HORA_ENTRADA, :CODIGO_VENDEDOR)';
ISQL.Params[0].AsDate := Date;
ISQL.Params[1].AsTime := Time;
ISQL.Params[2].AsInteger := StrToInt(Cadena);
end
else begin
ISQL.SQL.Text := 'update ENTRADAS_TAR set FECHA_SALIDA = :FECHA_SALIDA, HORA_SALIDA = :HORA_SALIDA where ID_ENTRADAS_TAR = :Id';
ISQL.Params[0].AsDate := Date;
ISQL.Params[1].AsTime := Time;
ISQL.Params[2].asInteger := Query.FieldByName('ID_ENTRADAS_TAR').AsInteger;
end;
ISQL.ExecQuery;
ISQL.FreeHandle;
Transaction.CommitRetaining;
end;
Query.Close;
Query.Free;
pcsc.Close;
pcsc.Disconnect;
pcsc.Open;
pcsc.Connect;
end;
procedure TTarjetaAAI.ServiceStart(Sender: TService; var Started: Boolean);
begin
Accion := 0;
Started := True;
end;
procedure TTarjetaAAI.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
Accion := 0;
Continued := True;
end;
procedure TTarjetaAAI.ServicePause(Sender: TService; var Paused: Boolean);
begin
Accion := 1;
Paused := False;
end;
procedure TTarjetaAAI.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Accion := 2;
Stopped := False;
end;
procedure TTarjetaAAI.ServiceExecute(Sender: TService);
begin
Try
While (Accion <> 2) do begin
Sleep(1000);
ServiceThread.ProcessRequests(False);
end;
Finally
ServiceThread.ProcessRequests(True);
End;
end;
procedure TTarjetaAAI.ServiceShutdown(Sender: TService);
begin
Accion := 2;
end;
end.
Gracias de antemano.