为什么IEGetProtectedModeCookie()总是返回0x80070057

本文关键字:返回 0x80070057 IEGetProtectedModeCookie 为什么 | 更新日期: 2023-09-27 17:59:19

根据"http://msdn.microsoft.com/en-us/library/cc196998%28v=VS.85%29.aspx",我写了以下代码来尝试获得IE保护的cookie:

public static string GetProtectedModeCookie(string lpszURL, string lpszCookieName, uint dwFlags)
{
    var size = 255;
    var sb = new System.Text.StringBuilder(size);
    var acturalSize = sb.Capacity;
    var code = IEGetProtectedModeCookie(lpszURL, lpszCookieName, sb, ref acturalSize, dwFlags);
    if ((code & 0x80000000) > 0) return string.Empty;
    if (acturalSize > size)
    {
        sb.EnsureCapacity(acturalSize);
        IEGetProtectedModeCookie(lpszURL, lpszCookieName, sb, ref acturalSize, dwFlags);
    }
    return sb.ToString();
}
[DllImport("ieframe.dll", SetLastError = true)]
public static extern uint IEGetProtectedModeCookie(string lpszURL, string lpszCookieName, System.Text.StringBuilder pszCookieData, ref int pcchCookieData, int dwFlags);

测试此功能:

var cookies = GetProtectedModeCookie("http://bbs.pcbeta.com/", null, 0);

但是apiIEGetProtectedModeCookie总是返回0x80070057,这表明一个或多个参数无效。我很困惑,经过一番尝试终于失败了,只得到了这个结果。有人能帮我吗?

为什么IEGetProtectedModeCookie()总是返回0x80070057

IEGetProtectedModeCookie如果认为URL不打算在保护模式下打开,则会返回E_INVALIDARG。它使用IEIsProtectedModeURL API来确定这一点。因此,如果你已经将该URL放在受信任区域或其他什么地方,那么你会遇到这个错误。如果未能传递URL或未能传递指向缓冲区大小整数的指针,则基础InternetGetCookie API将返回E_INVALIDARG。

还要注意,IEGetProtectedModeCookie API将无法从高完整性(如管理)过程中工作;它将返回ERROR_INVALID_ACCESS(0x8000000C)。

这是我使用的代码:

[DllImport("ieframe.dll", CharSet = CharSet.Unicode, EntryPoint = "IEGetProtectedModeCookie", SetLastError = true)]
public static extern int IEGetProtectedModeCookie(String url, String cookieName, StringBuilder cookieData, ref int size, uint flag);

private void GetCookie_Click(object sender, EventArgs e)
{
    int iSize = 4096;
    StringBuilder sbValue = new StringBuilder(iSize);
    int hResult = IEAPI.IEGetProtectedModeCookie("http://www.google.com", "PREF", sbValue, ref iSize, 0);
    if (hResult == 0)
    {
        MessageBox.Show(sbValue.ToString());
    }
    else
    {
        MessageBox.Show("Failed to get cookie. HRESULT=0x" + hResult.ToString("x") + "'nLast Win32Error=" + Marshal.GetLastWin32Error().ToString(), "Failed");
    }
}

Charset参数必须存在于DllImport属性中。将API声明更改为如下将运行良好:

[DllImport("ieframe.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern uint IEGetProtectedModeCookie(string lpszURL, string lpszCookieName, System.Text.StringBuilder pszCookieData, ref int pcchCookieData, uint dwFlags);

如果错过字符集参数,此API将始终返回0x80070057,这表示一个或多个参数无效。