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();
Другие вопросы по тегам