2012-04-16 17 views
6

Attualmente sto lavorando per ottenere i dati dei cookie con Csharp. Sto usando DLLImport per invocare InternetGetCookie in wininet.dll, ma quando lo provo le funzioni restituiscono un ERROR_INSUFFICIENT_BUFFER (codice di errore 122).Wininet InternetGetCookie ottiene dati cookie vuoti

Qualcuno può aiutarmi con questo?

Questo è il codice di riferimento 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); 

e questo è il modo che io chiamo la funzione:

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

Grazie.

risposta

9

Il valore di ritorno indica che il buffer fornito alla funzione non è abbastanza grande da contenere i dati che desidera restituire. Devi chiamare lo InternetGetCookie due volte: una volta che passi in una dimensione di 0, per scoprire quanto dovrebbe essere grande il buffer; e una seconda volta, con un buffer della giusta dimensione.

Inoltre, la firma P/Invoke è errata; StringBuilder non deve essere un parametro ref (e il parametro EntryPoint non è corretto poiché non specifica il nome del punto di ingresso corretto).

dichiarare la funzione in questo modo:

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

quindi chiamare in questo modo:

// 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

Mio Dio, che cosa terribile API: D Ma grazie, avevo bisogno anche quello. – TheSHEEEP