Почему IEGetProtectedModeCookie () всегда возвращает 0x80070057? - PullRequest
3 голосов
/ 14 июня 2011

В соответствии с описанием функции в "http://msdn.microsoft.com/en-us/library/cc196998%28v=VS.85%29.aspx", я написал следующий код, чтобы попытаться получить куки, защищенные IE:

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);

Но API IEGetProtectedModeCookie всегда возвращает 0x80070057 , что указывает на недопустимость одного или нескольких аргументов. Я был смущен, после многих попыток, наконец, не удалось, только получить этот результат. Кто-нибудь может мне помочь?

Ответы [ 2 ]

5 голосов
/ 14 июня 2011

IEGetProtectedModeCookie вернет E_INVALIDARG, если он считает, что URL-адрес не предназначен для открытия в защищенном режиме.Это определяется с помощью API IEIsProtectedModeURL .Так что, если вы поместили этот URL в доверенную зону или еще что-то, вы получите эту ошибку.Базовый API InternetGetCookie вернет E_INVALIDARG, если вам не удастся передать URL или передать указатель на целое число для размера буфера.

Также обратите внимание, что API IEGetProtectedModeCookie не будет работать из-за высокой целостностинапример, Admin) процесс;он вернет 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");
    }
}
1 голос
/ 15 июня 2011

Параметр 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);

Если пропущен параметр Charset , этот API всегда будет возвращать 0x80070057 , что указываетодин или несколько аргументов неверны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...