Wininet InternetGetCookie получает пустые данные cookie
В настоящее время я работаю над получением файлов cookie с помощью Csharp. Я использую DLLImport для вызова InternetGetCookie в wininet.dll, но когда я пытаюсь это сделать, функции возвращают ERROR_INSUFFICIENT_BUFFER (код ошибки 122).
Кто-нибудь может мне с этим помочь?
Это код ссылки 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);
И вот как я вызываю функцию:
InternetGetCookie("http://example.com", null, ref lpszCookieData, ref size)
Благодарю.
1 ответ
Возвращаемое значение говорит о том, что буфер, предоставленный вами функции, недостаточно велик, чтобы содержать данные, которые он хочет вернуть. Вам нужно позвонить InternetGetCookie
дважды: один раз, передав размер 0, чтобы узнать, насколько большим должен быть буфер; и второй раз, с буфером правильного размера.
Кроме того, подпись P/Invoke неверна; StringBuilder
не должно быть ref
параметр (и EntryPoint
неверный параметр, так как он не указывает правильное имя точки входа).
Объявите функцию следующим образом:
[DllImport("wininet.dll", SetLastError = true)]
public static extern bool InternetGetCookie(string lpszUrl, string lpszCookieName,
StringBuilder lpszCookieData, ref int lpdwSize);
Тогда назовите это так:
// 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();