Mestre JoséQuintas , Rochinha e ou alguém que tem experiencia em consumir dll.
Aproveitando como eu poderia ler uma dll c# no harbour ou no xharbour tenho este exemplo de leitura em delphi
DLL para assinatura do XML do eSocial com Certificado A3 via HASH SHA256.
Como usar
Há duas DLL´s que precisam ser copiadas para a pasta do executável do seu projeto, a eSocialSignature.dll e a Security.Cryptography.dll. Ambas podem ser encontradas na pasta do projeto de exemplo em Delphi;
Há dois métodos, sendo que SignSHA256Ansi é específico para linguagens não-unicode (no caso do Delphi são as versões inferiores a 2009);
Ambas podem ser usadas em linguages com Unicode, desde que seja usado da maneira correta, sendo SignSHA256Unicode a indicada para essas linguages (no caso do Delphi são as versões 2009 e superiores);
Caso deseje usar com Delphi você pode copiar o arquivo eSocialSignature.pas na pasta de exemplo em Delphi;
Caso contrário você pode fazer referência aos métodos diretamente, ou carregar dinamicamente (recomendado):
1- Passar o texto do XML para uma variável do PAnsiChar ou PChar, conforme plataforma utilizada, utilizando o devido cast;
2 - Passar a variável para o devido método de assinatura com os demais parâmetros;
3- Usar a mesma variável com o XML já assinado;
4- Dos métodos de assinatura os parâmetros são:
Referencia Direta:
Código: Selecionar todos
procedure SignSHA256Ansi(
var xml: PAnsiChar;
nodeToSign: PAnsiChar;
certificateSerialNumber: PAnsiChar;
certificatePassword: PAnsiChar); stdcall; external 'eSocialSignature.dll';
procedure SignSHA256Unicode(
var xml: PChar;
nodeToSign: PChar;
certificateSerialNumber: PChar;
certificatePassowrd: PChar); stdcall; external 'eSocialSignature.dll';
Referencia dinâmica:
Código: Selecionar todos
procedure SignSHA256Ansi(var AXml: PAnsiChar; ANodeToSign: PAnsiChar;
ASerialNumber: PAnsiChar; APassword: PAnsiChar);
type
TProc = procedure(var AXml: PAnsiChar; ANodeToSign: PAnsiChar;
ASerialNumber: PAnsiChar; APassword: PAnsiChar); stdcall;
var
dllHandle: THandle;
proc: TProc;
begin
dllHandle := LoadLibrary('eSocialSignature.dll');
if dllHandle < HINSTANCE_ERROR then
begin
raise Exception.Create('Não foi possível encontrar a DLL ' + DLLNAME + '.' +#13+
SysErrorMessage(GetLastError));
end;
try
@proc := GetProcAddress(dllHandle, 'SignSHA256Ansi');
if Assigned(@proc) then
begin
proc(AXml, ANodeToSign, ASerialNumber, APassword);
end;
finally
FreeLibrary(dllHandle);
end;
end;
procedure SignSHA256Unicode(var AXml: PChar; ANodeToSign: PChar; ASerialNumber: PChar; APassword: PChar);
type
TProc = procedure(var AXml: PChar; ANodeToSign: PChar; ASerialNumber: PChar; APassword: PChar); stdcall;
var
dllHandle: THandle;
proc: TProc;
begin
dllHandle := LoadLibrary('eSocialSignature.dll');
if dllHandle < HINSTANCE_ERROR then
begin
raise Exception.Create('Não foi possível encontrar a DLL ' + DLLNAME + '.' +#13+
SysErrorMessage(GetLastError));
end;
try
@proc := GetProcAddress(dllHandle, 'SignSHA256Unicode');
if Assigned(@proc) then
begin
proc(AXml, ANodeToSign, ASerialNumber, APassword);
end;
finally
FreeLibrary(dllHandle);
end;
end;
Exemplo Delphi
Código: Selecionar todos
var
xml: PAnsiChar;
begin
xml := PAnsiChar(AnsiString(xmlDoc.XML.Text));
TESocialSignature.SignSHA256Unicode(xml, 'evtInfoEmpregador', 'eaee2da6eabd4e0aa211e2a18e7c749c', '1234');
xmlDoc.LoadXml(xml);
end;
Código: Selecionar todos
var
xml: PChar;
begin
xml := PChar(xmlDoc.XML.Text);
TESocialSignature.SignSHA256Unicode(xml, 'evtInfoEmpregador', 'eaee2da6eabd4e0aa211e2a18e7c749c', '1234');
xmlDoc.LoadXml(xml);
end;
Exemplo em delphi esta aqui [*]
https://www.4shared.com/zip/TGm279OYei/DelphiTest.html