Mudar a Porta do DataSnap em execução

Delphi

19/10/2018

Bom dia Galera estou com um Problema que não consigo resolver.
Tenho um Servidor DataSnap - Roda com serviço.
Quando compilo com form funciona certinho, mas quando passo para Servico da erro na procedure de configurarINI.
Segue a unit
unit uSC;

interface

uses System.SysUtils, System.Classes,vcl.SvcMgr,
Datasnap.DSTCPServerTransport,IniFiles,
Datasnap.DSServer, Datasnap.DSCommonServer,
IPPeerServer, IPPeerAPI, Datasnap.DSAuth;

type
TServerContainer1 = class(TService)
DSServer1: TDSServer;
DSTCPServerTransport1: TDSTCPServerTransport;
DSServerClass1: TDSServerClass;
procedure DSServerClass1GetClass(DSServerClass: TDSServerClass;
var PersistentClass: TPersistentClass);
procedure ServiceStart(Sender: TService; var Started: Boolean);
private
procedure CodificarINI;
{ Private declarations }
protected
function DoStop: Boolean; override;
function DoPause: Boolean; override;
function DoContinue: Boolean; override;
procedure DoInterrogate; override;
public
function GetServiceController: TServiceController; override;
end;

var
ServerContainer1: TServerContainer1;

implementation

{%CLASSGROUP ''''System.Classes.TPersistent''''}

{$R *.dfm}

uses
Winapi.Windows,
uSM;

procedure TServerContainer1.DSServerClass1GetClass(
DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);
begin
PersistentClass := uSM.TSM;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
ServerContainer1.Controller(CtrlCode);
end;

function TServerContainer1.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

function TServerContainer1.DoContinue: Boolean;
begin
Result := inherited;
DSServer1.Start;
end;

procedure TServerContainer1.DoInterrogate;
begin
inherited;
end;

function TServerContainer1.DoPause: Boolean;
begin
DSServer1.Stop;
Result := inherited;
end;

function TServerContainer1.DoStop: Boolean;
begin
DSServer1.Stop;
Result := inherited;
end;

procedure TServerContainer1.ServiceStart(Sender: TService; var Started: Boolean);
begin
CodificarINI;
DSServer1.Start;
end;

procedure TServerContainer1.CodificarINI;
var ArquivoINI : TInifile;
porta : String;
begin
try
ArquivoINI:= TIniFile.Create(GetCurrentDir+''''\\\\\\\\Porta.ini'''');
Porta := ArquivoINI.ReadString(''''Configuracao'''',''''Porta'''',Porta);
DSTCPServerTransport1.Port := StrToInt(Porta);
except raise Exception.Create(''''Não achei o Arquivo'''');
end;
FreeAndNil(ArquivoINI);
end;

end.
Claudio Silva

Claudio Silva

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

19/10/2018

Deve ter relação com a criação do arquivo. Se não me engano um serviço tem como base a pasta System do Windows, e talvez o programa não tenha permissão para gravar ali.
No lugar de GetCurrentDir, tente:
- informar o caminho completo do arquivo, ou
- utilizar ExtractFilePath(ParamStr(0))+'\\Porta.ini'
procedure TServerContainer1.CodificarINI;
var ArquivoINI : TInifile;
porta : String;
caminho: string;
begin
	try
		caminho := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
		ArquivoINI := TIniFile.Create(caminho+'\\Porta.ini');
		Porta := ArquivoINI.ReadString('Configuracao','Porta',Porta);
		DSTCPServerTransport1.Port := StrToInt(Porta);
	except
		raise Exception.Create('Não achei o Arquivo');
	end;
	FreeAndNil(ArquivoINI);
end;




GOSTEI 1

Mais Respostas

Emerson Nascimento

Emerson Nascimento

19/10/2018

Qual o erro apresentado?
Você salva o projeto com a conexão ativa?
GOSTEI 0
Claudio Silva

Claudio Silva

19/10/2018

Quanto vou iniciar o serviço retorna erro, não inicializa, se tiro a chamada
CodificarINI e coloca a porta no DSTCPServerTransport1.Port compilo e mando inicializar funciona certinho.

Meu email para contato : claudio@crssoftware.com.br
GOSTEI 0
Claudio Silva

Claudio Silva

19/10/2018

Muito obrigado, funcionou certinho.

GOSTEI 0
POSTAR