2012-04-16 2 views
6

私は現在、Csharpでクッキーデータを取得しようとしています。 DLLImportを使ってwininet.dllのInternetGetCookieを呼び出していますが、試してみると関数はERROR_INSUFFICIENT_BUFFER(エラーコード122)を返します。Wininet InternetGetCookieが空のクッキーデータを取得する

これを手伝ってもらえますか?

これは、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) 

感謝。

答えて

9

戻り値は、関数に渡したバッファが、返すデータを格納するのに十分な大きさではないことを示しています。 InternetGetCookieを2回呼び出す必要があります。バッファの大きさを調べるには、一度サイズ0を渡します。 2回目は、正しいサイズのバッファで処理します。

さらに、P/Invokeシグネチャは間違っています。 StringBuilderrefパラメータであってはなりません(正しいエントリポイント名が指定されていないので、EntryPointパラメータは間違っています)。

は次のように関数を宣言:

// 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(); 
+0

私の神、どのような恐ろしいAPI:

[DllImport("wininet.dll", SetLastError = true)] public static extern bool InternetGetCookie(string lpszUrl, string lpszCookieName, StringBuilder lpszCookieData, ref int lpdwSize); 

そして、そのようにそれを呼び出すDしかし、おかげで、私も、ことを必要としていました。 – TheSHEEEP

関連する問題