10

現在、Csharp で Cookie データを取得する作業を行っています。wininet.dll で InternetGetCookie を呼び出すために DLLImport を使用していますが、試してみると、関数は 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

戻り値は、関数に指定したバッファーが、関数が返したいデータを格納するのに十分な大きさではないことを示しています。2 回呼び出す必要があります。1InternetGetCookie回目はサイズ 0 を渡し、バッファの大きさを確認します。2 回目は、適切なサイズのバッファーを使用します。

さらに、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 に答える