Skip to content

Commit 8663732

Browse files
author
Raul
committed
Carregar DLL Tef Elgin Hub de forma dinamica.
Basta criar a classe e utilizá-la.
1 parent 5322df2 commit 8663732

File tree

1 file changed

+296
-16
lines changed
  • Exemplos TEF/Exemplos TEF DLL - ATIVO/Delphi/ApiTefElgin

1 file changed

+296
-16
lines changed
Lines changed: 296 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,311 @@
1-
unit FuncoesDLL;
2-
3-
// define interface com funções exportadas da DLL
1+
unit FuncoesDLL;
42

53
interface
64

7-
function SetClientTCP(ip:PAnsiChar; porta:Integer):PAnsiChar;stdcall; external 'E1_Tef01.dll';
5+
uses
6+
Winapi.Windows,
7+
System.SysUtils,
8+
System.IOUtils,
9+
System.Generics.Collections;
810

9-
function ConfigurarDadosPDV(textoPinpad:PAnsiChar; versaoAC:PAnsiChar; nomeEstabelecimento:PAnsiChar; loja:PAnsiChar; identificadorPontoCaptura:PAnsiChar):PAnsiChar; stdcall; external 'E1_Tef01.dll';
11+
type
12+
TSetClientTCP = function(ip: PAnsiChar; porta: Integer): PAnsiChar; stdcall;
13+
TConfigurarDadosPDV = function(textoPinpad, versaoAC, nomeEstabelecimento, loja, identificadorPontoCaptura: PAnsiChar): PAnsiChar; stdcall;
14+
TIniciarOperacaoTEF = function(dadosCaptura: PAnsiChar): PAnsiChar; stdcall;
15+
TRecuperarOperacaoTEF = function(dadosCaptura: PAnsiChar): PAnsiChar; stdcall;
16+
TRealizarPagamentoTEF = function(codigoOperacao: Integer; dadosCaptura: PAnsiChar; novaTransacao: Boolean): PAnsiChar; stdcall;
17+
TRealizarPixTEF = function(dadosCaptura: PAnsiChar; novaTransacao: Boolean): PAnsiChar; stdcall;
18+
TRealizarAdmTEF = function(codigoOperacao: Integer; dadosCaptura: PAnsiChar; novaTransacao: Boolean): PAnsiChar; stdcall;
19+
TConfirmarOperacaoTEF = function(id, acao: Integer): PAnsiChar; stdcall;
20+
TFinalizarOperacaoTEF = function(id: Integer): PAnsiChar; stdcall;
21+
TRealizarColetaPinPad = function(tipoColeta: Integer; confirmar: Boolean): PAnsiChar; stdcall;
22+
TConfirmarCapturaPinPad = function(tipoCaptura: Integer; dadosCaptura: PAnsiChar): PAnsiChar; stdcall;
1023

11-
function IniciarOperacaoTEF(dadosCaptura:PAnsiChar):PAnsiChar; stdcall; external 'E1_Tef01.dll';
24+
type
25+
TElginDLL = class (TObject)
26+
strict private const
27+
PASTA_DLL = 'C:\Elgin\TEF\';
28+
DLL_ELGIN = PASTA_DLL + 'E1_Tef01.dll';
29+
strict private
30+
FCanExecute: Boolean;
31+
FDLLPaths: TList<string>;
32+
FHandles: TList<THandle>;
33+
FSetClientTCP: TSetClientTCP;
34+
FConfigurarDadosPDV: TConfigurarDadosPDV;
35+
FIniciarOperacaoTEF: TIniciarOperacaoTEF;
36+
FRecuperarOperacaoTEF: TRecuperarOperacaoTEF;
37+
FRealizarPagamentoTEF: TRealizarPagamentoTEF;
38+
FRealizarPixTEF: TRealizarPixTEF;
39+
FRealizarAdmTEF: TRealizarAdmTEF;
40+
FConfirmarOperacaoTEF: TConfirmarOperacaoTEF;
41+
FFinalizarOperacaoTEF: TFinalizarOperacaoTEF;
42+
FRealizarColetaPinPad: TRealizarColetaPinPad;
43+
FConfirmarCapturaPinPad: TConfirmarCapturaPinPad;
44+
function LoadDLL(const ADLLName: string): Boolean;
45+
procedure LoadAllDLLs();
46+
procedure UnloadAllDLLs();
47+
procedure InitializeFunctionPointers(const AHandle: THandle);
48+
procedure ClearFunctionPointers();
49+
procedure FillDLLPaths();
50+
function Execute<T>(const ACall: TFunc<T>): T;
51+
public
52+
constructor Create();
53+
destructor Destroy(); override;
54+
function SetClientTCP(const AIp: string; const APorta: Integer): PAnsiChar;
55+
function ConfigurarDadosPDV(const ATextoPinpad, AVersaoAC, ANomeEstabelecimento, ALoja, AIdentificadorPontoCaptura: string): PAnsiChar;
56+
function IniciarOperacaoTEF(const ADadosCaptura: PAnsiChar): PAnsiChar;
57+
function RecuperarOperacaoTEF(const ADadosCaptura: string): PAnsiChar;
58+
function RealizarPagamentoTEF(const ACodigoOperacao: Integer; const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
59+
function RealizarPixTEF(const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
60+
function RealizarAdmTEF(const ACodigoOperacao: Integer; const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
61+
function ConfirmarOperacaoTEF(const AId, AACao: Integer): PAnsiChar;
62+
function FinalizarOperacaoTEF(const AId: Integer): PAnsiChar;
63+
function RealizarColetaPinPad(const ATipoColeta: Integer; const AConfirmar: Boolean): PAnsiChar;
64+
function ConfirmarCapturaPinPad(const ATipoCaptura: Integer; const ADadosCaptura: string): PAnsiChar;
65+
end;
1266

13-
function RecuperarOperacaoTEF(dadosCaptura:PAnsiChar):PAnsiChar; stdcall; external 'E1_Tef01.dll';
67+
implementation
1468

15-
function RealizarPagamentoTEF(codigoOperacao:Integer; dadosCaptura:PAnsiChar; novaTransacao:Boolean):PAnsiChar;stdcall;external 'E1_Tef01.dll';
69+
{ TElginDLL }
1670

17-
function RealizarPixTEF(dadosCaptura:PAnsiChar; novaTransacao:Boolean):PAnsiChar;stdcall;external 'E1_Tef01.dll';
71+
constructor TElginDLL.Create();
72+
begin
73+
FCanExecute := False;
74+
FDLLPaths := TList<string>.Create();
75+
FHandles := TList<THandle>.Create();
76+
Self.FillDLLPaths();
77+
Self.LoadAllDLLs();
78+
end;
1879

19-
function RealizarAdmTEF(codigoOperacao:Integer; dadosCaptura:PAnsiChar; novaTransacao:Boolean):PAnsiChar;stdcall;external 'E1_Tef01.dll';
80+
destructor TElginDLL.Destroy();
81+
begin
82+
Self.UnloadAllDLLs();
83+
FHandles.Free();
84+
FDLLPaths.Free();
85+
inherited;
86+
end;
2087

21-
function ConfirmarOperacaoTEF(id:Integer; acao:Integer):PAnsiChar; stdcall; external 'E1_Tef01.dll';
88+
procedure TElginDLL.FillDLLPaths();
89+
begin
90+
FDLLPaths.Add(PASTA_DLL + 'libwinpthread-1.dll');
91+
FDLLPaths.Add(PASTA_DLL + 'libgcc_s_dw2-1.dll');
92+
FDLLPaths.Add(PASTA_DLL + 'libstdc++-6.dll');
93+
FDLLPaths.Add(PASTA_DLL + 'Qt5Core.dll');
94+
FDLLPaths.Add(PASTA_DLL + 'Qt5Network.dll');
95+
FDLLPaths.Add(PASTA_DLL + 'Qt5Gui.dll');
96+
FDLLPaths.Add(PASTA_DLL + 'Qt5Xml.dll');
97+
FDLLPaths.Add(DLL_ELGIN);
98+
end;
2299

23-
function FinalizarOperacaoTEF(id:Integer):PAnsiChar; stdcall; external 'E1_Tef01.dll';
100+
function TElginDLL.LoadDLL(const ADLLName: string): Boolean;
101+
var
102+
vDLLHandle: THandle;
103+
begin
104+
Result := False;
105+
if not TFile.Exists(ADLLName) then
106+
raise Exception.CreateFmt('DLL not found: %s', [ADLLName]);
24107

25-
function RealizarColetaPinPad(tipoColeta: integer; confirmar: boolean): PAnsiChar; stdcall; external 'E1_Tef01.dll';
108+
vDLLHandle := GetModuleHandle(PChar(ADLLName));
109+
if vDLLHandle = 0 then
110+
begin
111+
vDLLHandle := LoadLibrary(PChar(ADLLName));
112+
if vDLLHandle = 0 then
113+
raise Exception.CreateFmt('Error loading DLL: %s', [ADLLName]);
114+
end;
115+
FHandles.Add(vDLLHandle);
26116

27-
function ConfirmarCapturaPinPad(tipoCaptura: integer; dadosCaptura: PAnsiChar): PAnsiChar; stdcall; external 'E1_Tef01.dll';
117+
if ADLLName = DLL_ELGIN then
118+
Self.InitializeFunctionPointers(vDLLHandle);
119+
Result := True;
120+
end;
28121

29-
implementation
122+
procedure TElginDLL.UnloadAllDLLs();
123+
begin
124+
Self.ClearFunctionPointers();
125+
for var vHandle in FHandles do
126+
if (GetModuleHandle(PChar(vHandle)) > 0) then
127+
FreeLibrary(vHandle);
128+
end;
129+
130+
procedure TElginDLL.LoadAllDLLs();
131+
begin
132+
for var vDLL in FDLLPaths do
133+
begin
134+
try
135+
FCanExecute := Self.LoadDLL(vDLL);
136+
if not FCanExecute then
137+
raise Exception.CreateFmt('Erro ao carregar DDL de dependência: %s', [vDLL])
138+
except
139+
on E: Exception do
140+
raise Exception.CreateFmt('Erro ao carregar DDL de dependência %s: %s', [vDLL, E.Message]);
141+
end;
142+
end;
143+
end;
144+
145+
procedure TElginDLL.InitializeFunctionPointers(const AHandle: THandle);
146+
begin
147+
FSetClientTCP := GetProcAddress(AHandle, 'SetClientTCP');
148+
FConfigurarDadosPDV := GetProcAddress(AHandle, 'ConfigurarDadosPDV');
149+
FIniciarOperacaoTEF := GetProcAddress(AHandle, 'IniciarOperacaoTEF');
150+
FRecuperarOperacaoTEF := GetProcAddress(AHandle, 'RecuperarOperacaoTEF');
151+
FRealizarPagamentoTEF := GetProcAddress(AHandle, 'RealizarPagamentoTEF');
152+
FRealizarPixTEF := GetProcAddress(AHandle, 'RealizarPixTEF');
153+
FRealizarAdmTEF := GetProcAddress(AHandle, 'RealizarAdmTEF');
154+
FConfirmarOperacaoTEF := GetProcAddress(AHandle, 'ConfirmarOperacaoTEF');
155+
FFinalizarOperacaoTEF := GetProcAddress(AHandle, 'FinalizarOperacaoTEF');
156+
FRealizarColetaPinPad := GetProcAddress(AHandle, 'RealizarColetaPinPad');
157+
FConfirmarCapturaPinPad := GetProcAddress(AHandle, 'ConfirmarCapturaPinPad');
158+
159+
if not Assigned(FSetClientTCP) or not Assigned(FConfigurarDadosPDV) or
160+
not Assigned(FIniciarOperacaoTEF) or not Assigned(FRecuperarOperacaoTEF) or
161+
not Assigned(FRealizarPagamentoTEF) or not Assigned(FRealizarPixTEF) or
162+
not Assigned(FRealizarAdmTEF) or not Assigned(FConfirmarOperacaoTEF) or
163+
not Assigned(FFinalizarOperacaoTEF) or not Assigned(FRealizarColetaPinPad) or
164+
not Assigned(FConfirmarCapturaPinPad) then
165+
raise Exception.CreateFmt('Não foi possível carregar as funções da DLL Elgin: %s', [DLL_ELGIN]);
166+
end;
167+
168+
procedure TElginDLL.ClearFunctionPointers();
169+
begin
170+
@FSetClientTCP := nil;
171+
@FConfigurarDadosPDV := nil;
172+
@FIniciarOperacaoTEF := nil;
173+
@FRecuperarOperacaoTEF := nil;
174+
@FRealizarPagamentoTEF := nil;
175+
@FRealizarPixTEF := nil;
176+
@FRealizarAdmTEF := nil;
177+
@FConfirmarOperacaoTEF := nil;
178+
@FFinalizarOperacaoTEF := nil;
179+
@FRealizarColetaPinPad := nil;
180+
@FConfirmarCapturaPinPad := nil;
181+
end;
182+
183+
function TElginDLL.Execute<T>(const ACall: TFunc<T>): T;
184+
begin
185+
if not FCanExecute then
186+
Exit();
187+
try
188+
Result := ACall();
189+
except
190+
on E: Exception do
191+
begin
192+
raise Exception.CreateFmt('Erro ao executar função. Detalhes: %s', [E.Message]);
193+
end;
194+
end;
195+
end;
196+
197+
function TElginDLL.RealizarAdmTEF(const ACodigoOperacao: Integer; const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
198+
begin
199+
Result := Self.Execute<PAnsiChar>(
200+
function: PAnsiChar
201+
begin
202+
Result := FRealizarAdmTEF(ACodigoOperacao, PAnsiChar(AnsiString(ADadosCaptura)), ANovaTransacao);
203+
end
204+
);
205+
end;
206+
207+
function TElginDLL.RealizarColetaPinPad(const ATipoColeta: Integer; const AConfirmar: Boolean): PAnsiChar;
208+
begin
209+
Result := Self.Execute<PAnsiChar>(
210+
function: PAnsiChar
211+
begin
212+
Result := FRealizarColetaPinPad(ATipoColeta, AConfirmar);
213+
end
214+
);
215+
end;
216+
217+
function TElginDLL.RealizarPagamentoTEF(const ACodigoOperacao: Integer; const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
218+
begin
219+
Result := Self.Execute<PAnsiChar>(
220+
function: PAnsiChar
221+
begin
222+
Result := FRealizarPagamentoTEF(ACodigoOperacao, PAnsiChar(AnsiString(ADadosCaptura)), ANovaTransacao);
223+
end
224+
);
225+
end;
226+
227+
function TElginDLL.RealizarPixTEF(const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
228+
begin
229+
Result := Self.Execute<PAnsiChar>(
230+
function: PAnsiChar
231+
begin
232+
Result := FRealizarPixTEF(PAnsiChar(AnsiString(ADadosCaptura)), ANovaTransacao);
233+
end
234+
);
235+
end;
236+
237+
function TElginDLL.RecuperarOperacaoTEF(const ADadosCaptura: string): PAnsiChar;
238+
begin
239+
Result := Self.Execute<PAnsiChar>(
240+
function: PAnsiChar
241+
begin
242+
Result := FRecuperarOperacaoTEF(PAnsiChar(AnsiString(ADadosCaptura)));
243+
end
244+
);
245+
end;
246+
247+
function TElginDLL.SetClientTCP(const AIp: string; const APorta: Integer): PAnsiChar;
248+
begin
249+
Result := Self.Execute<PAnsiChar>(
250+
function: PAnsiChar
251+
begin
252+
Result := FSetClientTCP(PAnsiChar(AnsiString(AIp)), APorta);
253+
end
254+
);
255+
end;
256+
257+
function TElginDLL.IniciarOperacaoTEF(const ADadosCaptura: PAnsiChar): PAnsiChar;
258+
begin
259+
Result := Self.Execute<PAnsiChar>(
260+
function: PAnsiChar
261+
begin
262+
Result := FIniciarOperacaoTEF(ADadosCaptura);
263+
end
264+
);
265+
end;
266+
267+
function TElginDLL.FinalizarOperacaoTEF(const AId: Integer): PAnsiChar;
268+
begin
269+
Result := Self.Execute<PAnsiChar>(
270+
function: PAnsiChar
271+
begin
272+
Result := FFinalizarOperacaoTEF(AId);
273+
end
274+
);
275+
end;
276+
277+
function TElginDLL.ConfigurarDadosPDV(const ATextoPinpad, AVersaoAC, ANomeEstabelecimento, ALoja, AIdentificadorPontoCaptura: string): PAnsiChar;
278+
begin
279+
Result := Self.Execute<PAnsiChar>(
280+
function: PAnsiChar
281+
begin
282+
Result := FConfigurarDadosPDV(PAnsiChar(AnsiString(ATextoPinpad)),
283+
PAnsiChar(AnsiString(AVersaoAC)),
284+
PAnsiChar(AnsiString(ANomeEstabelecimento)),
285+
PAnsiChar(AnsiString(ALoja)),
286+
PAnsiChar(AnsiString(AIdentificadorPontoCaptura)));
287+
end
288+
);
289+
end;
290+
291+
function TElginDLL.ConfirmarCapturaPinPad(const ATipoCaptura: Integer; const ADadosCaptura: string): PAnsiChar;
292+
begin
293+
Result := Self.Execute<PAnsiChar>(
294+
function: PAnsiChar
295+
begin
296+
Result := FConfirmarCapturaPinPad(ATipoCaptura, PAnsiChar(AnsiString(ADadosCaptura)));
297+
end
298+
);
299+
end;
300+
301+
function TElginDLL.ConfirmarOperacaoTEF(const AId, AACao: Integer): PAnsiChar;
302+
begin
303+
Result := Self.Execute<PAnsiChar>(
304+
function: PAnsiChar
305+
begin
306+
Result := FConfirmarOperacaoTEF(AId, AACao);
307+
end
308+
);
309+
end;
30310

31-
end.
311+
end.

0 commit comments

Comments
 (0)