1- unit FuncoesDLL;
2-
3- // define interface com funções exportadas da DLL
1+ unit FuncoesDLL;
42
53interface
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