トップページ⇒tech
922コメント290KB

IEコンポーネントを使い倒すスレ

■ このスレッドは過去ログ倉庫に格納されています
0001IUnknownNGNG
=====================================

IEコンポーネントを利用したブラウザのプログラミングに関する情報の交換及び再
利用を目的とした総合情報スレッドです。

=====================================


最近IEコンポーネントを利用してブラウザを作るプログラマが増えてきました。こ
れから自作してみようという人も多いでしょう。コンポーネントを貼り付けるだけ
なら誰でも出来ますが複雑な制御を行うにはそれなりの経験や知識が要るようです。
私自身が知りたいのも山々ですが、似たような質問が分散するのを避けるためにも
統一しましょう。ブラウザ作者、COM に精通した方大歓迎です。もちろん公開した
くない "禁断のテク" もあると思いますが、そこは各人の判断ということでお願い
します。

※ 開発言語は問わないことにしますので質問するときはその辺を踏まえてお願いし
ます。
0655654NGNG
上のを書き込んで書き込みボタンを押した瞬間に
ソースが脳裏に浮かんでチェックしてみたら二つ目は出来ました!

というか、Cancelのスペルを間違っていて、ご丁寧にも間違った
スペルのCanselを変数宣言していたのでエラーは出ないけど
ちゃんと動いていただけだという、なんともおまぬけな・・・

これでmailto制限や禁止URLなんかも作れそうです。

一つ目のはやっぱり分からないので、どなたか〜〜(;´д⊂)
0656デフォルトの名無しさんNGNG
historyか?
0657デフォルトの名無しさんNGNG
>>654
help を見た感じでは、こんな流れで実現出来るかな? 的外れならスマソ。
確認していないので、動作の保障は出来ませんけど。

下準備
あらかじめ、ダミーの WebBrowser Object を作っておいて Navigate2 ハンドラをセットしておく。

処理
1. メインの WebBrowser Object の NewWindow2 イベントハンドラが呼ばれる。
2. ppDisp にダミーの WebBrowser Object をセットする。
3. NewWindow2 イベントハンドラ終了。
4. ダミーの WebBrowser Object の Navigate2 ハンドラが呼ばれる。
5. Navigate 先の URL を保存。Cancel を True に設定。
6. メインの WebBrowser Object の URL を、この Navigate2 ハンドラで得られた URL に変更 (Navigate) する。
7. Navigate2 ハンドラ終了。

6 で Navigate した時に、NewWindow2 イベントが発生しない事を前提にしているので、
その可能性がある場合は、別途、対策をしておいてください。
0658652NGNG
>653
ありがとうっす。
ただ、別の簡単な方法を思いついたので、とりあえずはそっちで済ます事にしました。
でもそれはあんまり確実じゃなさそうなので、
WindowClosingイベントのIsChildWindowみたいのを、
別の時に知る方法が有るかどうかを引き続き調べてるんですが、
どなたかご存じないですか?

ちなみに今は、とりあえずこんな感じにしてある。
procedure THoge.BrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
var Doc2: IHTMLDocument2;
begin
Doc2 := FBrowser.Document as IHTMLDocument2; //FBrowser: TWebBrowser;
// Scriptで勝手に開くウインドウの場合は、大抵がactiveElement = nilになるっぽい。
if Doc2.activeElement = nil then begin // 以下略
0659652NGNG
やっぱダメだ。
>658の方法じゃ半分くらいしかポップアップウインドウを消せない。
0660デフォルトの名無しさんNGNG
ポップアップ広告を完全に排除しようと思うとMozillaみたいな方法しかないと思うが。
0661デフォルトの名無しさんNGNG
インターネットからのデータ読み込みについて質問です
まず、コードを出したほうが話が早いので、、、
----------------------------------------------------------
CStdioFile* pFile = NULL;
try {
pFile = pInternetSession->OpenURL(theURL_full,1,(INTERNET_FLAG_RELOAD | INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_DONT_CACHE) );
}
catch(CInternetException *e)
{
::MessageBox(NULL,"インターネットからファイルが取得できませんでした","ERROR",MB_OK);
e->Delete();
return FALSE;
}
if (pFile == NULL) return FALSE;
//ローカルへ書き込み
buffer = new char[65536];
cFile.Open(theFile_full,CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone | CFile::typeBinary);
while(1)
{
n = pFile->Read(buffer,65536);
cFile.Write(buffer,n);
if(n < 65536)break;
}
cFile.Close();
---------------------------------------------------------
といった感じで、指定したURLからデータをバッファに読み込むプログラムなのですが、仮に指定したURLが無効であったり、指定した
ファイルがなかった場合に、例外を発生してくれればエラー処理しやすいのですが、そうではなく、正常に読み込めたものと
みなして、読み込んだバッファに
「404 error(サーバーによって異なる)」
みたいな文字列が入ってしまうのです。未然にそれを感知して防ぐ(不正URLを読まない)にはどうしたらよいでしょうか?
教えてください
0662661NGNG
661でバッファに読み込むと書いておりましたが
ファイルへのストリーム書き出し処理の間違いでした
0663デフォルトの名無しさんNGNG
スレ違いの予感
0664デフォルトの名無しさんNGNG
>661
>未然にそれを感知して防ぐ
たぶん出来ない。ていうか普通はそうしない。
いったんどっかの変数に入れて、ごちゃごちゃっと処理を済ませた分から保存してく。
でないと、ヘッダも丸ごと保存する事になっちゃうし、
Transfer-Encoding: chunkedの時とか何か余計なのが混じったままになっちゃうし。
てかそれよりスレ違い。

ネットワークプログラミング相談室 Port5
http://pc2.2ch.net/test/read.cgi/tech/1040220302/l50
0665デフォルトの名無しさんNGNG
>>661
委員長、乙
0666デフォルトの名無しさんNGNG
>>661
CHttpFileはCStdioFileから派生されている。
CInternetSession::OpenURLは内部的にHTTPからのレスポンス(HINTERNET)を
CHttpFileを生成して格納し、CStdioFile*として返している。
(そのままCHttpFile*として返さないのはFTPなどの場合も考慮してのこと)
OpenURLの戻り値をCHttpFile*にキャストして、CHttpFile::QueryInfoStatusCodeを使えばよい。
0667664NGNG
む。Cは解らんのに適当に答えたら、はずしてもうた。
0668デフォルトの名無しさんNGNG
WinInetの問題で言語は関係ないだろ。
恥の上塗りだぞ
0669デフォルトの名無しさんNGNG
いや、WinInetというよりはMFC固有の問題だから、
C(含むC++)を使ってないというのであれば、そう的外れでもない。
が、そもそも口をはさむのが間違い
0670デフォルトの名無しさんNGNG
WinInetの問題というより、インターネッツの問題だろ。
サーバと通信できないのと、
サーバが、んなファイルネーヨって返事してくるのは別もの。
0671デフォルトの名無しさんNGNG
>>670
いやだから、404が返って来た時に200とは別処理にしたいってことでしょ。
ファイルが見つからないのを200で返されることもままあるけど。
MFCスレじゃないと混乱が起きるな。
0672デフォルトの名無しさんNGNG
ttp://www.microsoft.com/japan/msdn/web/ie/ie55/beyondprintpreview.asp
↑この印刷テンプレートって使ったことある人いますか?
サンプルになりそうなC++のコードとかあったら教えてください。
0673デフォルトの名無しさんNGNG
IEでアクセスした時に、Httpのステータス(404など)を取得する方法ってありませんか?
DocumentCompleteイベントあたりで取得できないものかな?
0674デフォルトの名無しさんNGNG
>>672
IEコンポーネント(のことだよね)にURL渡す前に、HEADメソッドでリクエスト飛ばすってのはダメなの?
0675674NGNG
>>673ね。
0676デフォルトの名無しさんNGNG
プログラミングの話題とすこしずれて恐縮なのですが、
リンクをクリックした際に、リンク先のURLが履歴に残らない
HTMLの作成方法ってありますか?
ご教授ください
0677デフォルトの名無しさんNGNG
>>676
あります。
0678676NGNG
>>677
方法か参考URLをご教授ください
0679デフォルトの名無しさんNGNG
BCCで IEコンポーネントってつかえるの?
0680デフォルトの名無しさんNGNG
VBまたはVC++でリファラーを変えるにはどうすればいいの?
0681デフォルトの名無しさんNGNG
>>679
できます。というかgccでも使えるんだからできないとおかしい。
0682デフォルトの名無しさんNGNG
選択範囲を取得または設定するにはどうしたらいいのでしょうか
IHTMLSelectElemetやIHTMLSelectionObject辺りが怪しいなと思ったんですが…
0683デフォルトの名無しさんNGNG
IHTMLSelectElemetは<select>〜</select>のことだから
ぜんぜん関係ない
0684ageNGNG
0685デフォルトの名無しさんNGNG
>682
たぶんこの辺
IHTMLDocument2::selection
IHTMLBodyElement::createTextRange

ttp://hogehoge2001.tripod.co.jp/note-delphi.html

ttp://www.codeproject.com/useritems/chtmlview_search.asp
0686デフォルトの名無しさんNGNG
インターネットオプションとは別に、IEコンポーネントでプロクシを設定するには
どうすればいいのでしょうか?
調べてみたところ、InternetSetOption()やUrlMkSetSessionOption()があったの
ですが、なんか大本の設定を変更するような感じで…
0687デフォルトの名無しさんNGNG
sageてしまった
0688デフォルトの名無しさんNGNG
>>686
>大本の設定を変更する
俺もどこかで、そんな説明を読んだ気がするけど、
実際URLMkSetSessionOptionを試してみたら、
ちゃんと自作ブラウザだけ変更されたよ。
0689682NGNG
>>683
>>685
さんくすです
無事出来ました。
0690デフォルトの名無しさんNGNG
このスレだけ一度に全部読めない。
0691デフォルトの名無しさんNGNG
IE で CTRL+F を押したときに使える検索機能は、
IE のコンポーネントの一部ですか?

この検索機能で不具合を発見し、どこに相談すればいいかわからず、
こちらのスレの方は詳しいかと思ってカキコしてます。

以下、スレ違いですが、フグ愛の内容っす。

具体的には、下記のサイトで、PCDATA という文字列を検索すると
処理が戻ってこない(ハング)というものです。
http://www.fxis.co.jp/DMS/sgml/xml/rec-xml.html

まだ完全に、現象を発生させる方法は分かってません。
IE のキャッシュをクリアすると、再現しなくなることもあります。
0692デフォルトの名無しさんNGNG
>>691
(゚∀゚)やられた! オレのも帰ってこなくなった!
手動ブラクラ発動!って感じ? みたいな?
0693デフォルトの名無しさんNGNG
MFCでWebブラウザコントロールを用いてそれを印刷したい場合、
// Verify the Web Browser control is valid.
LPDISPATCH lpDispApp = m_web_view1.GetApplication();
if(lpDispApp)
{
// Get the HTMLDocument interface.
LPDISPATCH lpDispDoc = m_web_view1.GetDocument();
if (lpDispDoc != NULL)
{
// Get the IOleCommandTarget interface so that we can dispatch the command.
LPOLECOMMANDTARGET lpTarget = NULL;
if (SUCCEEDED(lpDispDoc->QueryInterface(IID_IOleCommandTarget,(LPVOID*) &lpTarget)))
{
// Execute the print preview command. The control will handle the print preview GUI.
// OLECMDID_PRINTPREVIEW is defined in "docobj.h".
lpTarget->Exec(NULL, OLECMDID_PRINTPREVIEW, 0, NULL, NULL);
lpTarget->Release();
}
lpDispDoc->Release();
}
lpDispApp->Release();
}
みたいなコードで出来ますが、URLが印刷されちゃいますよね。
それを隠す方法があれば、ご教授ください

よろしくお願いします
0694デフォルトの名無しさんNGNG
Delphiでタブブラウザ作るぞエイエイオー
0695デフォルトの名無しさんNGNG
http://www.nitoyon.com/vc/tips/ie_component.htm
このページとMSDN見ながらポチポチ弄ってるんだが
IHTMLDocument2::write()の使い方が今一判らん…
0696695NGNG
なんかリビルドしたらうまく動きますた。

ちなみに、MSDNのIHTMLDocument2::writeのところのサンプルコードをDWebBrowserEvent2::DocumentComplete()
のタイミングで入れてまふ
0697デフォルトの名無しさんNGNG
ネタが無いんだがとりあえず保守ageしときますた。
0698デフォルトの名無しさんNGNG
Webブラウザオブジェクトに表示させた
Webページ上から、別のページにリンクした際に、そのURLを
履歴に残さないようにする方法ってありますか?

リンクに飛ぶ前にOnBeforeNavigate2を捕捉することはできても、
肝心のフラグ設定(履歴を残さない)とかはできないようですね・・・

すいませんが、ご教授ください
0699デフォルトの名無しさんNGNG
>>698
過去ログで解答の出なかった話題は諦めろ。
0700デフォルトの名無しさんNGNG
>698
2chツールみたいに自前でページの取得するしかないんじゃない?
0701デフォルトの名無しさんNGNG
ページ設定で変更できる内容をプログラムから変更ってできないですかね?
0702デフォルトの名無しさんNGNG
>>701
スレ違い?
0703任意のIE履歴を消すNGNG
unsigned shortwStr[256];
MultiByteToWideChar(
CP_ACP, // ANSI code page
0, // 既定の変換方法
"http://www.microsoft.com", // 変換元文字列
-1, // 変換元文字列サイズ(-1指定で自動計算)
&wStr[0], // 変換先バッファ
256); // 変換先バッファサイズ
CoInitialize(NULL);
IUrlHistoryStg2* pUrlHistoryStg2 = NULL;
HRESULT hr = CoCreateInstance(CLSID_CUrlHistory,
NULL, CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg2,
(void**)&pUrlHistoryStg2);
if (SUCCEEDED(hr))
{
hr = pUrlHistoryStg2->ClearHistory();
hr = pUrlHistoryStg2->DeleteUrl((LPCOLESTR)&wStr[0],0);
pUrlHistoryStg2->Release();
}
CoUninitialize();
こんな感じで組みましたがうまく消えてくれません
どこに問題があるかご教授お願いします
0704703NGNG
本当に使いたいのはDeleteURLです。
試しにClearURLも使ってみましたが、
こちらもうまく機能しません。
(エラーコードは0なのですが・・・)

どなたか教えてください
0705デフォルトの名無しさんNGNG
http://support.microsoft.com/?id=312777

↑のを参考にして、右クリックされたときのイベントを捕まえようと思ったのですが、
ハンドラを追加していないイベントが発生しません。。
仕様っぽいのですが、他のイベントも発生させるにはどうしたらいいのでしょうか。

HTMLDocument doc = (HTMLDocument)axWebBrowser1.Document;
HTMLDocumentEvents2_Event event = (HTMLDocumentEvents2_Event)doc;
event.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(OnContextMenu);

private bool OnContextMenu(IHTMLEventObj e)
{
  MessageBox.Show("OnContextMenu");
  return true;
}

言語はC#です。
0706デフォルトの名無しさんNGNG
OnNewWindow2の時のURLはどうやって取得するの?
0707デフォルトの名無しさんNGNG
>706
IDocHostUIHandler::TranslateUrl
0708デフォルトの名無しさんNGNG
だれか>>703に教えてやれよ
せっかくソースコードまでのせてんだからさ
0709デフォルトの名無しさんNGNG
>>708
マルチの自作自演てはじめて見た。
0710デフォルトの名無しさんNGNG
>>709
ワロタ
このマルチ、スゲェな。
0711デフォルトの名無しさんNGNG
>>606
>>676
>>698
>>703
必 死 だ な (w
0712703NGNG
>>708
お口添えありがとうございます
やっぱり特殊分野なので、さすがにみんなわからないんでしょうね
悔しければ703のリストの問題点を指摘してください
0713デフォルトの名無しさんNGNG
わかるけど、自演厨には教えたくないからさ・・・
0714デフォルトの名無しさんNGNG
>>712
こんな所で釣りすんなYO
0715デフォルトの名無しさんNGNG
マルチ自演厨ってすごいと思った
0716デフォルトの名無しさんNGNG
相互リンク
■ VisualC++(MFC限定)相談室 MFC7.dll■
http://pc2.2ch.net/test/read.cgi/tech/1047949606/l50
0717140NGNG
>>713
ちょっと姑息な手を使ったのは認めます
素直にあやまりますので教えていただけませんか?
ほんとにやばいので・・・
0718デフォルトの名無しさんNGNG
…ちょっと?
0719140NGNG
実はわからねーんだろお前らw
レベル低いね(プゲラ
悔しかったらとっととコード書いてみろってんだ(ゲラ
0720140 ◆KxJwJ3q4Cw NGNG
719は私ではありません
とりあえずトリップつけます
703の件ですが、ほんとにやばいです
どうかお力添えをば・・・
0721デフォルトの名無しさんNGNG
( ´_ゝ`)
0722 NGNG
面白いのでマターリ観察しよっと
0723デフォルトの名無しさんNGNG
まず、「どうヤバイのか」からだな
0724デフォルトの名無しさんNGNG
>>703
>unsigned shortwStr[256];
>MultiByteToWideChar(
>CP_ACP, // ANSI code page
>0, // 既定の変換方法
>"http://www.microsoft.com", // 変換元文字列
>-1, // 変換元文字列サイズ(-1指定で自動計算)
>&wStr[0], // 変換先バッファ
>256); // 変換先バッファサイズ

なんでこんな馬鹿なことやってんの?
wchar_t* wStr = L"http://www.microsoft.com";
でええやん。
0725デフォルトの名無しさんNGNG
>>140
俺は最近、松井の口が西田敏行になってきてることに危惧している
0726デフォルトの名無しさんNGNG
>>724
例だからじゃないの?
実際には関数の引数とかが渡されるんでしょ
で、履歴の消し方だが確かURLの頭に「Visited:」
と付ける必要がある
0727デフォルトの名無しさんNGNG
>724
エラーになる罠

WCHAR wStr[] = L"http://www.maccrosoft.com/";
0728デフォルトの名無しさんNGNG
>>727
それはおかしいよ
0729デフォルトの名無しさんNGNG
>>727
>>724がエラーになるって、コンパイラは何使ってるの?
0730デフォルトの名無しさんNGNG
>727
724も727もエラーにはならんが普通はやらんな。
0731デフォルトの名無しさんNGNG
>>730
(゜Д゚) hala?
0732デフォルトの名無しさんNGNG
ハラ?
0733デフォルトの名無しさんNGNG
両方ともエラーにならんし、普通に使う。
おまえらCの勉強やり直せ。
0734デフォルトの名無しさんNGNG
ドキュメントの幅を取得する方法ってないですか?
スクロールバーでスクロールする分も含めたサイズを取得したいのですが。
0735デフォルトの名無しさんNGNG
>>734
HTMLDocument doc = ...;
HTMLBody body = (HTMLBody)doc.body;
int width = body.scrollWidth;
int height = body.scrollHeight;

こんな感じでとれない?
0736デフォルトの名無しさんNGNG
>734
IHTMLElement2::scrollWidth
このプロパティでたぶん取得出来ると思う。
0737デフォルトの名無しさんNGNG
>>735
ちなみに、それは何の言語?
0738735NGNG
>>737
一応C#からの流用
0739デフォルトの名無しさんNGNG
画像の拡大縮小は出来るのですが
回転はできますか?
0740デフォルトの名無しさんNGNG
age
0741デフォルトの名無しさんNGNG
>>735
>>736
ありがとうございます。取得できました。
ただ、これって大きくしたらその分増えてしまうのですね。

横スクロールバーを表示するかしないかの基準ってどうなってるのだろう・・・。
0742デフォルトの名無しさんNGNG
>>741
ウィンドウの横幅よりドキュメントのが大きければ
横スクロールバーが出ます。
ドキュメントの幅というのはドキュメントの内容に左右されます。
0743デフォルトの名無しさんNGNG
>>742
そのドキュメントの幅を取得できないかなぁと思い、widhやclientwidthも試してみたのですが、
どうも違うようです。なんとか取得できないものでしょうか。
0744デフォルトの名無しさんNGNG
WebBrowserコントロールのHWNDをVBから利用するとエラーが発生します。
hWndの取得方法ってありますか?
0745デフォルトの名無しさんNGNG
>>744
なんで取得できないんだろうね?
ついこの間必要だったのでちょっと整理してサンプル貼り付け。
使用するときは、GetWebBrowserHWND(Me.hWnd)とWebBrowserコントロールを
置いているフォームを指定してね。

注意
SPY++で調べれば分かるけど、WebBrowserは、Shell Embeddingの中にShell DocObjectの中に
Internet Explorer_Serverがあるという形になっている。
Internet Explorer_Serverがたぶん必要なHWNDだと思う。
ただしWebBrowserになにも表示していない場合、Shell Embeddingの中にはなにも存在しなので
取得できない。Shell Embedding以外のHWNDも内部的に無駄に取得しているのでそれ以外が
ほしければちょっと修正すればOK。
0746745NGNG
標準モジュールに書いてね。
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private ShellEmbeddingHWND As Long
Private ShellDocObjectHWND As Long
Private InternetExplorerServerHWND As Long

Public Function GetWebBrowserHWND(ByVal OwnerHWND As Long) As Long
  InternetExplorerServerHWND = 0
  ShellEmbeddingHWND = 0
  ShellDocObjectHWND = 0
  Call EnumChildWindows(OwnerHWND, AddressOf EnumChildProc, 0)
  GetWebBrowserHWND = InternetExplorerServerHWND
End Function

Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
  Dim Length As Long
  Dim Name As String
  Dim NullPos As Long

  Name = String(255, vbNullChar)
  Length = Len(Name)
  If GetClassName(hwnd, Name, Length) <> 0 Then
    NullPos = InStr(Name, vbNullChar)
    If NullPos > 0 Then Name = Left$(Name, NullPos - 1)
    If Name = "Shell Embedding" Then ShellEmbeddingHWND = hwnd
    If Name = "Shell DocObject" Then ShellDocObjectHWND = hwnd
    If Name = "Internet Explorer_Server" Then InternetExplorerServerHWND = hwnd
  End If
  EnumChildProc = True
End Function
0747745NGNG
修正
こっちのほうがいいか。GetWebBrowserHWND(WebBrowser1)として呼び出せるし。
Public Function GetWebBrowserHWND(ByVal wb As WebBrowser) As Long
  Dim OwnerHWND As Long
  OwnerHWND = wb.Parent.hWnd
  InternetExplorerServerHWND = 0
  ShellEmbeddingHWND = 0
  ShellDocObjectHWND = 0
  Call EnumChildWindows(OwnerHWND, AddressOf EnumChildProc, 0)
  GetWebBrowserHWND = InternetExplorerServerHWND
End Function
0748デフォルトの名無しさんNGNG
FindWindowExでいいじゃん
0749デフォルトの名無しさんNGNG
IHtmlWindowからIWebBrowserを得ることは無理かな?
コンテキストメニューの拡張用スクリプト内で、ExecWB使いたいのだけど。
0750山崎渉NGNG
(^^)
0751デフォルトの名無しさんNGNG
http://members.jcom.home.ne.jp/monazilla/document/directwrite.html
↑こういうことをVC++でやりたいんですが、どうすれば良いのでしょうか?
0752デフォルトの名無しさんNGNG
>751
たぶんこれ
ttp://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/tutorials/webocstream.asp
0753デフォルトの名無しさんNGNG
>>752
∧_∧   
( ´∀`)< それぽ


0754山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
■ このスレッドは過去ログ倉庫に格納されています