IEコンポーネントを使い倒すスレ
■ このスレッドは過去ログ倉庫に格納されています
0001IUnknown
NGNGIEコンポーネントを利用したブラウザのプログラミングに関する情報の交換及び再
利用を目的とした総合情報スレッドです。
=====================================
最近IEコンポーネントを利用してブラウザを作るプログラマが増えてきました。こ
れから自作してみようという人も多いでしょう。コンポーネントを貼り付けるだけ
なら誰でも出来ますが複雑な制御を行うにはそれなりの経験や知識が要るようです。
私自身が知りたいのも山々ですが、似たような質問が分散するのを避けるためにも
統一しましょう。ブラウザ作者、COM に精通した方大歓迎です。もちろん公開した
くない "禁断のテク" もあると思いますが、そこは各人の判断ということでお願い
します。
※ 開発言語は問わないことにしますので質問するときはその辺を踏まえてお願いし
ます。
0653デフォルトの名無しさん
NGNGリンクをクリックしてない時にウィンドウが現れたら、
Popupウインドウだと判断すればいいんじゃないの?
0654デフォルトの名無しさん
NGNGブラウザを作っています。
ここしばらくぐぐったり読めない英語ページのサンプルを見たりして
色々と調べていたのですが、分からないので分かる方がいたら
ヒントだけでも教えてください。
一つ目は、新規ウインドウを自分自身に表示する。というのを
NewWindow2イベント内で自身のオブジェクを新規に作成して投げる
事で解決できたと思ったのですが、これをやると新規ウインドウから
前へ「戻る」事ができません。
「戻る」ボタンが利くように自分自身のウインドウに表示できないでしょうか?
二つ目は、mailtoタグなどをクリックされたときにメールクライアントが
起動するのを抑制したいのですが、BeforeNavigate2イベント内で
mailtoを判別できても、それをキャンセルする方法が分かりません。
何か方法は無いでしょうか・・・(=;ω;)ノ�K
0655654
NGNGソースが脳裏に浮かんでチェックしてみたら二つ目は出来ました!
というか、Cancelのスペルを間違っていて、ご丁寧にも間違った
スペルのCanselを変数宣言していたのでエラーは出ないけど
ちゃんと動いていただけだという、なんともおまぬけな・・・
これでmailto制限や禁止URLなんかも作れそうです。
一つ目のはやっぱり分からないので、どなたか〜〜(;´д⊂)
0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNGhelp を見た感じでは、こんな流れで実現出来るかな? 的外れならスマソ。
確認していないので、動作の保障は出来ませんけど。
下準備
あらかじめ、ダミーの 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 イベントが発生しない事を前提にしているので、
その可能性がある場合は、別途、対策をしておいてください。
0658652
NGNGありがとうっす。
ただ、別の簡単な方法を思いついたので、とりあえずはそっちで済ます事にしました。
でもそれはあんまり確実じゃなさそうなので、
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 // 以下略
0659652
NGNG>658の方法じゃ半分くらいしかポップアップウインドウを消せない。
0660デフォルトの名無しさん
NGNG0661デフォルトの名無しさん
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を読まない)にはどうしたらよいでしょうか?
教えてください
0662661
NGNGファイルへのストリーム書き出し処理の間違いでした
0663デフォルトの名無しさん
NGNG0664デフォルトの名無しさん
NGNG>未然にそれを感知して防ぐ
たぶん出来ない。ていうか普通はそうしない。
いったんどっかの変数に入れて、ごちゃごちゃっと処理を済ませた分から保存してく。
でないと、ヘッダも丸ごと保存する事になっちゃうし、
Transfer-Encoding: chunkedの時とか何か余計なのが混じったままになっちゃうし。
てかそれよりスレ違い。
ネットワークプログラミング相談室 Port5
http://pc2.2ch.net/test/read.cgi/tech/1040220302/l50
0665デフォルトの名無しさん
NGNG委員長、乙
0666デフォルトの名無しさん
NGNGCHttpFileはCStdioFileから派生されている。
CInternetSession::OpenURLは内部的にHTTPからのレスポンス(HINTERNET)を
CHttpFileを生成して格納し、CStdioFile*として返している。
(そのままCHttpFile*として返さないのはFTPなどの場合も考慮してのこと)
OpenURLの戻り値をCHttpFile*にキャストして、CHttpFile::QueryInfoStatusCodeを使えばよい。
0667664
NGNG0668デフォルトの名無しさん
NGNG恥の上塗りだぞ
0669デフォルトの名無しさん
NGNGC(含むC++)を使ってないというのであれば、そう的外れでもない。
が、そもそも口をはさむのが間違い
0670デフォルトの名無しさん
NGNGサーバと通信できないのと、
サーバが、んなファイルネーヨって返事してくるのは別もの。
0671デフォルトの名無しさん
NGNGいやだから、404が返って来た時に200とは別処理にしたいってことでしょ。
ファイルが見つからないのを200で返されることもままあるけど。
MFCスレじゃないと混乱が起きるな。
0672デフォルトの名無しさん
NGNG↑この印刷テンプレートって使ったことある人いますか?
サンプルになりそうなC++のコードとかあったら教えてください。
0673デフォルトの名無しさん
NGNGDocumentCompleteイベントあたりで取得できないものかな?
0674デフォルトの名無しさん
NGNGIEコンポーネント(のことだよね)にURL渡す前に、HEADメソッドでリクエスト飛ばすってのはダメなの?
0676デフォルトの名無しさん
NGNGリンクをクリックした際に、リンク先のURLが履歴に残らない
HTMLの作成方法ってありますか?
ご教授ください
0677デフォルトの名無しさん
NGNGあります。
0678676
NGNG方法か参考URLをご教授ください
0679デフォルトの名無しさん
NGNG0680デフォルトの名無しさん
NGNG0681デフォルトの名無しさん
NGNGできます。というかgccでも使えるんだからできないとおかしい。
0682デフォルトの名無しさん
NGNGIHTMLSelectElemetやIHTMLSelectionObject辺りが怪しいなと思ったんですが…
0683デフォルトの名無しさん
NGNGぜんぜん関係ない
0684age
NGNG0685デフォルトの名無しさん
NGNGたぶんこの辺
IHTMLDocument2::selection
IHTMLBodyElement::createTextRange
ttp://hogehoge2001.tripod.co.jp/note-delphi.html
ttp://www.codeproject.com/useritems/chtmlview_search.asp
0686デフォルトの名無しさん
NGNGどうすればいいのでしょうか?
調べてみたところ、InternetSetOption()やUrlMkSetSessionOption()があったの
ですが、なんか大本の設定を変更するような感じで…
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNG>大本の設定を変更する
俺もどこかで、そんな説明を読んだ気がするけど、
実際URLMkSetSessionOptionを試してみたら、
ちゃんと自作ブラウザだけ変更されたよ。
0690デフォルトの名無しさん
NGNG0691デフォルトの名無しさん
NGNGIE のコンポーネントの一部ですか?
この検索機能で不具合を発見し、どこに相談すればいいかわからず、
こちらのスレの方は詳しいかと思ってカキコしてます。
以下、スレ違いですが、フグ愛の内容っす。
具体的には、下記のサイトで、PCDATA という文字列を検索すると
処理が戻ってこない(ハング)というものです。
http://www.fxis.co.jp/DMS/sgml/xml/rec-xml.html
まだ完全に、現象を発生させる方法は分かってません。
IE のキャッシュをクリアすると、再現しなくなることもあります。
0692デフォルトの名無しさん
NGNG(゚∀゚)やられた! オレのも帰ってこなくなった!
手動ブラクラ発動!って感じ? みたいな?
0693デフォルトの名無しさん
NGNG// 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デフォルトの名無しさん
NGNG0695デフォルトの名無しさん
NGNGこのページとMSDN見ながらポチポチ弄ってるんだが
IHTMLDocument2::write()の使い方が今一判らん…
0696695
NGNGちなみに、MSDNのIHTMLDocument2::writeのところのサンプルコードをDWebBrowserEvent2::DocumentComplete()
のタイミングで入れてまふ
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNGWebページ上から、別のページにリンクした際に、そのURLを
履歴に残さないようにする方法ってありますか?
リンクに飛ぶ前にOnBeforeNavigate2を捕捉することはできても、
肝心のフラグ設定(履歴を残さない)とかはできないようですね・・・
すいませんが、ご教授ください
0699デフォルトの名無しさん
NGNG過去ログで解答の出なかった話題は諦めろ。
0700デフォルトの名無しさん
NGNG2chツールみたいに自前でページの取得するしかないんじゃない?
0701デフォルトの名無しさん
NGNG0702デフォルトの名無しさん
NGNGスレ違い?
0703任意のIE履歴を消す
NGNGMultiByteToWideChar(
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();
こんな感じで組みましたがうまく消えてくれません
どこに問題があるかご教授お願いします
0704703
NGNG試しにClearURLも使ってみましたが、
こちらもうまく機能しません。
(エラーコードは0なのですが・・・)
どなたか教えてください
0705デフォルトの名無しさん
NGNG↑のを参考にして、右クリックされたときのイベントを捕まえようと思ったのですが、
ハンドラを追加していないイベントが発生しません。。
仕様っぽいのですが、他のイベントも発生させるにはどうしたらいいのでしょうか。
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デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNGIDocHostUIHandler::TranslateUrl
0708デフォルトの名無しさん
NGNGせっかくソースコードまでのせてんだからさ
0709デフォルトの名無しさん
NGNGマルチの自作自演てはじめて見た。
0710デフォルトの名無しさん
NGNGワロタ
このマルチ、スゲェな。
0711デフォルトの名無しさん
NGNG>>676
>>698
>>703
必 死 だ な (w
0712703
NGNGお口添えありがとうございます
やっぱり特殊分野なので、さすがにみんなわからないんでしょうね
悔しければ703のリストの問題点を指摘してください
0713デフォルトの名無しさん
NGNG0714デフォルトの名無しさん
NGNGこんな所で釣りすんなYO
0715デフォルトの名無しさん
NGNG0716デフォルトの名無しさん
NGNG■ VisualC++(MFC限定)相談室 MFC7.dll■
http://pc2.2ch.net/test/read.cgi/tech/1047949606/l50
0717140
NGNGちょっと姑息な手を使ったのは認めます
素直にあやまりますので教えていただけませんか?
ほんとにやばいので・・・
0718デフォルトの名無しさん
NGNG0719140
NGNGレベル低いね(プゲラ
悔しかったらとっととコード書いてみろってんだ(ゲラ
0720140 ◆KxJwJ3q4Cw
NGNGとりあえずトリップつけます
703の件ですが、ほんとにやばいです
どうかお力添えをば・・・
0721デフォルトの名無しさん
NGNG0723デフォルトの名無しさん
NGNG0724デフォルトの名無しさん
NGNG>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俺は最近、松井の口が西田敏行になってきてることに危惧している
0726デフォルトの名無しさん
NGNG例だからじゃないの?
実際には関数の引数とかが渡されるんでしょ
で、履歴の消し方だが確かURLの頭に「Visited:」
と付ける必要がある
0727デフォルトの名無しさん
NGNGエラーになる罠
WCHAR wStr[] = L"http://www.maccrosoft.com/";
0728デフォルトの名無しさん
NGNGそれはおかしいよ
0729デフォルトの名無しさん
NGNG>>724がエラーになるって、コンパイラは何使ってるの?
0730デフォルトの名無しさん
NGNG724も727もエラーにはならんが普通はやらんな。
0731デフォルトの名無しさん
NGNG(゜Д゚) hala?
0732デフォルトの名無しさん
NGNG0733デフォルトの名無しさん
NGNGおまえらCの勉強やり直せ。
0734デフォルトの名無しさん
NGNGスクロールバーでスクロールする分も含めたサイズを取得したいのですが。
0735デフォルトの名無しさん
NGNGHTMLDocument doc = ...;
HTMLBody body = (HTMLBody)doc.body;
int width = body.scrollWidth;
int height = body.scrollHeight;
こんな感じでとれない?
0736デフォルトの名無しさん
NGNGIHTMLElement2::scrollWidth
このプロパティでたぶん取得出来ると思う。
0737デフォルトの名無しさん
NGNGちなみに、それは何の言語?
0739デフォルトの名無しさん
NGNG回転はできますか?
0740デフォルトの名無しさん
NGNG0741デフォルトの名無しさん
NGNG>>736
ありがとうございます。取得できました。
ただ、これって大きくしたらその分増えてしまうのですね。
横スクロールバーを表示するかしないかの基準ってどうなってるのだろう・・・。
0742デフォルトの名無しさん
NGNGウィンドウの横幅よりドキュメントのが大きければ
横スクロールバーが出ます。
ドキュメントの幅というのはドキュメントの内容に左右されます。
0743デフォルトの名無しさん
NGNGそのドキュメントの幅を取得できないかなぁと思い、widhやclientwidthも試してみたのですが、
どうも違うようです。なんとか取得できないものでしょうか。
0744デフォルトの名無しさん
NGNGhWndの取得方法ってありますか?
0745デフォルトの名無しさん
NGNGなんで取得できないんだろうね?
ついこの間必要だったのでちょっと整理してサンプル貼り付け。
使用するときは、GetWebBrowserHWND(Me.hWnd)とWebBrowserコントロールを
置いているフォームを指定してね。
注意
SPY++で調べれば分かるけど、WebBrowserは、Shell Embeddingの中にShell DocObjectの中に
Internet Explorer_Serverがあるという形になっている。
Internet Explorer_Serverがたぶん必要なHWNDだと思う。
ただしWebBrowserになにも表示していない場合、Shell Embeddingの中にはなにも存在しなので
取得できない。Shell Embedding以外のHWNDも内部的に無駄に取得しているのでそれ以外が
ほしければちょっと修正すればOK。
0746745
NGNGPrivate 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
0747745
NGNGこっちのほうがいいか。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デフォルトの名無しさん
NGNG0749デフォルトの名無しさん
NGNGコンテキストメニューの拡張用スクリプト内で、ExecWB使いたいのだけど。
0750山崎渉
NGNG0751デフォルトの名無しさん
NGNG↑こういうことをVC++でやりたいんですが、どうすれば良いのでしょうか?
0752デフォルトの名無しさん
NGNGたぶんこれ
ttp://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/tutorials/webocstream.asp
■ このスレッドは過去ログ倉庫に格納されています