Jump to content
Rafael Adão

[Resolvido] WebService: InternetSetOption Error 122

Recommended Posts

Rafael Adão

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 by Rafael Adão

Share this post


Link to post
Share on other sites
Rafael Adão

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;

  • Vote 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.