2012-04-16 18 views
6

Tôi hiện đang làm việc để nhận dữ liệu cookie với Csharp. Tôi đang sử dụng DLLImport để gọi InternetGetCookie trong wininet.dll, nhưng khi tôi thử nó, hàm trả về ERROR_INSUFFICIENT_BUFFER (mã lỗi 122).Wininet InternetGetCookie nhận dữ liệu cookie trống

Có ai giúp tôi với điều này không?

Đây là mã của tài liệu tham khảo 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); 

Và đây là làm thế nào tôi gọi hàm:

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

Cảm ơn.

Trả lời

9

Giá trị trả về cho bạn biết rằng bộ đệm bạn đã cung cấp cho hàm không đủ lớn để chứa dữ liệu mà nó muốn trả lại. Bạn cần gọi số InternetGetCookie hai lần: một lần vượt qua kích thước bằng 0, để tìm hiểu dung lượng bộ đệm lớn; và lần thứ hai, với bộ đệm có kích thước phù hợp.

Ngoài ra, chữ ký P/Gọi là sai; StringBuilder không được là thông số ref (và thông số EntryPoint sai vì nó không chỉ định tên điểm nhập chính xác).

Khai báo hàm như thế này:

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

Sau đó gọi nó như vậy:

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

thần của tôi, những gì một API khủng khiếp: D Nhưng nhờ, tôi cần điều đó. – TheSHEEEP

Các vấn đề liên quan