[cbuilder:40034] 複数作ったTCppWebBrowserでcookieが共有される

213 views
Skip to first unread message

MAMAO2

unread,
Oct 6, 2008, 7:23:58 AM10/6/08
to cbui...@sfdata.ne.jp
mamao2です。
TCppWebBrowserでもう一つ困ったことが起きました。

TCppWebBrowserを2つ画面に配置して、
片方でyahooにログインした場合、
もう片方もログインした状態になってしまうんです。
というかcookieが同じものを使っている状態に・・
↓のソースで確認しました。

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
String address = "http://www.yahoo.co.jp";
CppWebBrowser1->Navigate(WideString(address));
CppWebBrowser2->Navigate(WideString(address));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
IHTMLDocument2* doc;
BSTR h;

CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (void**)&doc);
doc->get_cookie(&h);
ShowMessage(h);

CppWebBrowser2->Document->QueryInterface(IID_IHTMLDocument2, (void**)&doc);
doc->get_cookie(&h);
ShowMessage(h);
}
//---------------------------------------------------------------------------

それぞれのオブジェクトで別のcookieを保持するようにはできないでしょうか?
OnBeforeNavigate2でヘッダーを強制的に入れ換えればなんとかできるかな?
とは思っていますが、そもそも別管理にできればその必要もないので・・
どなたか手法ご存じないでしょうか?

畑井 和幸

unread,
Oct 6, 2008, 8:03:14 AM10/6/08
to cbui...@sfdata.ne.jp
畑井です。

予想です。
個々にクッキーの保存先を変えられれば可能かもしれませんが、
実行するユーザが別々じゃないとだめかもしれません。

ユーザーを偽装してTCppWebBrowserを処理すると可能だと思いますが、
同一アプリケーションのTCppWebBrowserで出来るか不明です。

> それぞれのオブジェクトで別のcookieを保持するようにはできないでしょうか?
> OnBeforeNavigate2でヘッダーを強制的に入れ換えればなんとかできるかな?
> とは思っていますが、そもそも別管理にできればその必要もないので・・
> どなたか手法ご存じないでしょうか?
>


━━━━━━━━━‥‥‥‥………
 畑井和幸
 e-mail: ha...@cospec.co.jp
‥‥‥‥‥………━━━━━━━━

MAMAO2

unread,
Oct 6, 2008, 10:32:55 AM10/6/08
to cbui...@sfdata.ne.jp

言葉足らずでした。
ファイルに保存されないookieで、
ブラウザを開いている間有効なタイプのものを意図しています。
つまりSESSIONIDのようなcokkieです。

この場合別プロセスになればcookieは別管理になるんでしょうけど・・

MAMAO2

unread,
Oct 11, 2008, 6:10:54 AM10/11/08
to cbui...@sfdata.ne.jp
まだ悩んでいるmamao2です。

TCppWebBrowserはmshtmlのラッパーなわけですが、
TCppWebBrowserを複数作っても同一プロセスはmshtml内でcookie共有してるみたいですね。

ならば、送信する際にcookieを置き換えれば・・と思ったのですが、
リクエストヘッダーにcookieを入れるのはmshtmlが自動的やっているのか、
cookieを消去できませんでした。

ネット上を探し回り、InternetSetCookieで書き換えられる?
というような情報を見つけたのですが、

InternetSetCookie(WideString(url), NULL, WideString("NID=")))
というようにコールしても
NID=xxxxxx;NID=
というように値が追加されるだけでした。

開いたサイト(例えばhttp://www.google.co.jp)と、
InternetSetCookieに渡すurlが違うのでしょうか?

うーん・・
どなたか良い案無いでしょうか?・・

MAMAO2

unread,
Oct 14, 2008, 6:40:21 AM10/14/08
to cbui...@sfdata.ne.jp
mamao2です。

ようやく情報を見つけました。
wininet.dllに含まれるInternetSetOptionでcookieを消せました。

以下のように呼び出しました。
InternetSetOption(0, INTERNET_OPTION_END_BROWSER_SESSION, NULL, 0);

最初の引数に0を指定すると自分のプロセスを指すようです。

ただこれが分かった時は既に方針を変えていまして、
TCppWebBrowserを1個しか作らないように作り替えた後でした。
ですので、cookieを入れ換えてTCppWebBrowserを使うやり方はできるか未確認です。

それと、TCppWebBrowserを1個しか作らなくても、
IEを単体で起動しているとそれともcookieを共有するらしく、
TCppWebBrowserを作りなおした時点でもcookieが残っていました。

そこでInternetSetOptionを呼び出したところ、
cookieをクリアしてくれました。
この場合、IEを単体で起動していた方には影響が無いようでした。


この情報を見つけたのは以下のサイトです。
http://www.codecomments.com/forum290/message160164.html

この情報を元にMSの情報が見つかりました。
http://support.microsoft.com/kb/195192/ja

以上解決に至りました。
情報ありがとうございました。

Reply all
Reply to author
Forward
0 new messages