10

我目前正在使用 Csharp 获取 cookie 数据。我正在使用 DLLImport 在 wininet.dll 中调用 InternetGetCookie,但是当我尝试它时,函数返回一个 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)

谢谢。

4

1 回答 1

16

返回值告诉你你提供给函数的缓冲区不够大,无法包含它想要返回的数据。您需要调用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();
于 2012-04-16T14:21:47.493 回答