2012-04-16 12 views
6

Obecnie pracuję nad pozyskiwaniem plików cookie z Csharp. Używam DLLImport do wywoływania InternetGetCookie w wininet.dll, ale gdy go wypróbuję, funkcje zwracają ERROR_INSUFFICIENT_BUFFER (kod błędu 122).Wininet InternetGetCookie pobiera puste dane cookie

Czy ktoś może mi w tym pomóc?

Jest to kod odniesienia 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); 

I to jest, jak się nazywamy funkcję:

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

Dzięki.

Odpowiedz

9

Wartość zwracana informuje, że bufor dostarczony do funkcji nie jest wystarczająco duży, aby pomieścić dane, które chce zwrócić. Musisz dwukrotnie zadzwonić pod numer InternetGetCookie: po przejściu w rozmiarze 0, aby dowiedzieć się, jak duży powinien być bufor; i drugi raz, z buforem odpowiedniej wielkości.

Dodatkowo podpis P/Invoke jest nieprawidłowy; StringBuilder nie powinien być parametrem ref (a parametr EntryPoint jest nieprawidłowy, ponieważ nie określa prawidłowej nazwy punktu wejścia).

stwierdzenie funkcję tak:

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

Następnie nazwać tak:

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

Mój Boże, co za straszny API: D Ale dzięki, potrzebowałem, że zbyt. – TheSHEEEP

Powiązane problemy