2012-04-16 19 views
6

Actualmente estoy trabajando para obtener datos de cookies con Csharp. Estoy usando DLLImport para invocar InternetGetCookie en wininet.dll, pero cuando lo intento, las funciones devuelven un ERROR_INSUFFICIENT_BUFFER (código de error 122).Wininet InternetGetCookie obtiene datos de cookie vacíos

¿Alguien me puede ayudar con esto?

Este es el código de la referencia DLL:

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint="InternetGetCookie")] 
     public static extern bool InternetGetCookie(string lpszUrl, string lpszCookieName, 
      ref StringBuilder lpszCookieData, ref int lpdwSize); 

Y esta es la forma en que llame a la función:

InternetGetCookie("http://example.com", null, ref lpszCookieData, ref size) 

Gracias.

Respuesta

9

El valor de retorno indica que el búfer que suministró a la función no es lo suficientemente grande como para contener los datos que desea devolver. Debe llamar al InternetGetCookie dos veces: una vez que pasa en un tamaño de 0, para averiguar qué tan grande debe ser el buffer; y una segunda vez, con un buffer del tamaño correcto.

Además, la firma de P/Invocar es incorrecta; StringBuilder no debe ser un parámetro ref (y el parámetro EntryPoint es incorrecto ya que no especifica el nombre del punto de entrada correcto).

declara la función como esta:

[DllImport("wininet.dll", SetLastError = true)] 
public static extern bool InternetGetCookie(string lpszUrl, string lpszCookieName, 
    StringBuilder lpszCookieData, ref int lpdwSize); 

Entonces lo llaman así:

// find out how big a buffer is needed 
int size = 0; 
InternetGetCookie("http://example.com", null, null, ref size); 

// create buffer of correct size 
StringBuilder lpszCookieData = new StringBuilder(size); 
InternetGetCookie("http://example.com", null, lpszCookieData, ref size); 

// get cookie 
string cookie = lpszCookieData.ToString(); 
+0

Mi dios, qué terrible API: D Pero gracias, lo necesitaba, también. – TheSHEEEP

Cuestiones relacionadas