Jump to content

[Resolvido] WebService: InternetSetOption Error 122


Rafael Adão

Recommended Posts

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.