Rafael Adão Posted July 17, 2012 Report Share Posted July 17, 2012 (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 by Rafael Adão Link to comment Share on other sites More sharing options...
Rafael Adão Posted July 20, 2012 Author Report Share Posted July 20, 2012 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