Rafael Adão Posted July 17, 2012 at 02:11 PM Report Share #468999 Posted July 17, 2012 at 02:11 PM (edited) Olá, Utilizado nos testes: Windows Xp SP 3, Delphi 2007, dll Capicom_TLB; Quero consumir serviços de um WebService de uma prefeitura. Eles disponibilizaram o arquivo "lotenfe.asmx", utilizei o WSDL Importer do Delphi para fazer a comunicação. A comunicação precisa ser autentificada por um Certificado Digital. Me ocorre o seguinte erro: Código do erro 122: "the data area passed to a system call is too small"; Em português: "A área de dados transferida para uma chamada do sistema é muito pequena"; Segue código do teste: procedure TForm1.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); var Store : IStore3; Certs : ICertificates2; Cert : ICertificate2; CertContext : ICertContext; PCertContext : Pointer; SerialNumber : String; i : Integer; begin SerialNumber := '277D643F0FAD465C'; //Número do serial a ser buscado do certificado. {Aqui colocado desta maneira apenas para enfatizar uma possível busca da configuração do sistema} Store := CoStore.Create; //Repositórios de Certifcados da Máquina Store.Open(CAPICOM_CURRENT_USER_STORE,'MY',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); //Abre a lista de certificados Certs := Store.Certificates as ICertificates2; //Aloca todos os certificados instalados na máquia i := 0; //loop de procura ao certificado requerido pelo número serial while i < Certs.Count do begin Cert := IInterface(Certs.Item[i+1]) as ICertificate2; //Cria objeto para acesso a leitura do certificado if UpperCase(Cert.SerialNumber) = UpperCase(SerialNumber) then //se o número do serial for igual ao que queremos utilizar begin //carrega informações do certificado CertContext := Cert as ICertContext; CertContext.Get_CertContext(Integer(PCertContext)); //84-INTERNET_OPTION_CLIENT_CERT_CONTEXT if not (InternetSetOption(Data, 84, PCertContext, Sizeof(CertContext))) then ShowMessage('Falha ao selecionar o certificado: ' + SysErrorMessage(GetLastError)); i := Certs.Count; //encerra o loop end; i := i + 1; end; end; Edited July 17, 2012 at 05:25 PM by Rafael Adão Link to comment Share on other sites More sharing options...
Rafael Adão Posted July 20, 2012 at 12:08 PM Author Report Share #469366 Posted July 20, 2012 at 12:08 PM Olá, Resolvi o problema. Durante os vários testes, resolvi alocar mais espaço para a estrutura apontada por PCertContext. Assim, coloquei um singelo sizeOf(CertContext)*5. Como ficou o código funcionando: procedure TNFSeBLUDataSender.BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); var Store : IStore3; Certs : ICertificates2; Cert : ICertificate2; CertContext : ICertContext; PCertContext : Pointer; SerialNumber : String; i : Integer; begin SerialNumber := '277D643F0FAD465C'; //Número do serial a ser buscado do certificado Store := CoStore.Create; //Repositórios de Certifcados da Máquina Store.Open(CAPICOM_CURRENT_USER_STORE,'MY',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); //Abre a lista de certificados Certs := Store.Certificates as ICertificates2; //Aloca todos os certificados instalados na máquia i := 0; //loop de procura ao certificado requerido pelo número serial while i < Certs.Count do begin Cert := IInterface(Certs.Item[i+1]) as ICertificate2; //Cria objeto para acesso a leitura do certificado if UpperCase(Cert.SerialNumber) = UpperCase(SerialNumber) then //se o número do serial for igual ao que queremos utilizar begin //carrega informações do certificado CertContext := Cert as ICertContext; CertContext.Get_CertContext(Integer(PCertContext)); //84-INTERNET_OPTION_CLIENT_CERT_CONTEXT if not (InternetSetOption( Data, 84, PCertContext, Sizeof(CertContext)*5)) then raise Exception.Create('Falha ao selecionar o certificado: ' + IntToStr(GetLastError)); i := Certs.Count; //encerra o loop end; i := i + 1; end; end; 1 Report Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now