2012-04-16 13 views
6

Şu anda Csharp ile çerez verileri almak için çalışıyorum. Wininet.dll içinde InternetGetCookie çağırmak için DLLImport kullanıyorum, ancak bunu çalıştığınızda, işlevler bir ERROR_INSUFFICIENT_BUFFER (hata kodu 122) döndürür.Wininet InternetGetCookie boş çerez verilerini alır

Bu konuda bana yardımcı olan var mı?

Bu

Dll referans kodu:

[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); 

Ve bu i işlevi çağırmak nasıl:

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

teşekkür ederiz.

cevap

9

Dönüş değeri, işleve sağladığınız arabelleğin, geri dönmek istediği verileri içerecek kadar büyük olmadığını size bildiriyor. Tamponun ne kadar büyük olması gerektiğini bulmak için InternetGetCookie'u iki kez aramanız gerekir: ve ikinci kez, doğru büyüklükte bir tampon ile. Ayrıca, P/Invoke imzası yanlıştır; StringBuilder, ref parametresi olmamalıdır (ve doğru giriş noktası adını belirtmediği için EntryPoint parametresi yanlıştır). D Ama teşekkürler, bende öyle gerekli:

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

Sonra şöyle diyoruz:

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

Benim tanrı, ne korkunç API

böyle fonksiyonu bildirin. – TheSHEEEP