Skip to content

Commit 3f52c55

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

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+
function IntializeFunctionPointer(const AHandle: THandle; const AFunctionName: string): Pointer;
49+
procedure ClearFunctionPointers();
50+
procedure FillDLLPaths();
51+
function Execute<T>(const ACall: TFunc<T>): T;
52+
public
53+
constructor Create();
54+
destructor Destroy(); override;
55+
function SetClientTCP(const AIp: string; const APorta: Integer): PAnsiChar;
56+
function ConfigurarDadosPDV(const ATextoPinpad, AVersaoAC, ANomeEstabelecimento, ALoja, AIdentificadorPontoCaptura: string): PAnsiChar;
57+
function IniciarOperacaoTEF(const ADadosCaptura: PAnsiChar): PAnsiChar;
58+
function RecuperarOperacaoTEF(const ADadosCaptura: string): PAnsiChar;
59+
function RealizarPagamentoTEF(const ACodigoOperacao: Integer; const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
60+
function RealizarPixTEF(const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
61+
function RealizarAdmTEF(const ACodigoOperacao: Integer; const ADadosCaptura: string; const ANovaTransacao: Boolean): PAnsiChar;
62+
function ConfirmarOperacaoTEF(const AId, AACao: Integer): PAnsiChar;
63+
function FinalizarOperacaoTEF(const AId: Integer): PAnsiChar;
64+
function RealizarColetaPinPad(const ATipoColeta: Integer; const AConfirmar: Boolean): PAnsiChar;
65+
function ConfirmarCapturaPinPad(const ATipoCaptura: Integer; const ADadosCaptura: string): PAnsiChar;
66+
end;
1267

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

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

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

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

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

23-
function FinalizarOperacaoTEF(id:Integer):PAnsiChar; stdcall; external 'E1_Tef01.dll';
101+
function TElginDLL.LoadDLL(const ADLLName: string): Boolean;
102+
var
103+
vDLLHandle: THandle;
104+
begin
105+
Result := False;
106+
if not TFile.Exists(ADLLName) then
107+
raise Exception.CreateFmt('DLL não encontrada na pasta padrão: %s', [PASTA_DLL + ADLLName]);
24108

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

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

29-
implementation
123+
procedure TElginDLL.UnloadAllDLLs();
124+
begin
125+
Self.ClearFunctionPointers();
126+
for var vHandle in FHandles do
127+
if (GetModuleHandle(PChar(vHandle)) > 0) then
128+
FreeLibrary(vHandle);
129+
end;
130+
131+
procedure TElginDLL.LoadAllDLLs();
132+
begin
133+
for var vDLL in FDLLPaths do
134+
begin
135+
try
136+
FCanExecute := Self.LoadDLL(vDLL);
137+
if not FCanExecute then
138+
raise Exception.CreateFmt('Erro ao carregar DLL de dependência: %s', [vDLL])
139+
except
140+
on E: Exception do
141+
raise Exception.CreateFmt('Erro ao carregar DLL de dependência %s: %s', [vDLL, E.Message]);
142+
end;
143+
end;
144+
end;
145+
146+
procedure TElginDLL.InitializeFunctionPointers(const AHandle: THandle);
147+
begin
148+
FSetClientTCP := Self.IntializeFunctionPointer(AHandle, 'SetClientTCP');
149+
FConfigurarDadosPDV := Self.IntializeFunctionPointer(AHandle, 'ConfigurarDadosPDV');
150+
FIniciarOperacaoTEF := Self.IntializeFunctionPointer(AHandle, 'IniciarOperacaoTEF');
151+
FRecuperarOperacaoTEF := Self.IntializeFunctionPointer(AHandle, 'RecuperarOperacaoTEF');
152+
FRealizarPagamentoTEF := Self.IntializeFunctionPointer(AHandle, 'RealizarPagamentoTEF');
153+
FRealizarPixTEF := Self.IntializeFunctionPointer(AHandle, 'RealizarPixTEF');
154+
FRealizarAdmTEF := Self.IntializeFunctionPointer(AHandle, 'RealizarAdmTEF');
155+
FConfirmarOperacaoTEF := Self.IntializeFunctionPointer(AHandle, 'ConfirmarOperacaoTEF');
156+
FFinalizarOperacaoTEF := Self.IntializeFunctionPointer(AHandle, 'FinalizarOperacaoTEF');
157+
FRealizarColetaPinPad := Self.IntializeFunctionPointer(AHandle, 'RealizarColetaPinPad');
158+
FConfirmarCapturaPinPad := Self.IntializeFunctionPointer(AHandle, 'ConfirmarCapturaPinPad');
159+
end;
160+
161+
function TElginDLL.IntializeFunctionPointer(const AHandle: THandle; const AFunctionName: string): Pointer;
162+
begin
163+
Result := GetProcAddress(AHandle, PAnsiChar(AnsiString(AFunctionName)));
164+
if not Assigned(Result) then
165+
raise Exception.CreateFmt('Não foi possível carregar a função: %s da DLL: %s', [AFunctionName, 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)