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

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

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

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

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


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

※ 開発言語は問わないことにしますので質問するときはその辺を踏まえてお願いし
ます。
0263デフォルトの名無しさんNGNG
>>262
HTMLViewでコンテキストメニューを捕まえたいなら、
IDocHostUIHandler::ShowContextMenu()だね
0264デフォルトの名無しさんNGNG
>>263
サンクス
0265デフォルトの名無しさんNGNG
>>264
COM必須だからがんばってね
0266デフォルトの名無しさんNGNG
>249
RFC?
そんなの知らなくても大丈夫だyo!
MFC&WebBrowserコントロールで楽勝
0267デフォルトの名無しさんNGNG
ドラッグ&ドロップを無視する方法ってないかな?
ドラッグソースとしてもドラッグターゲットとしても機能させたくないんだけど
0268デフォルトの名無しさんNGNG
>>267
何の話だよ?
IEの?
0269267NGNG
IEコンポーネントです
0270デフォルトの名無しさんNGNG
IDocHostUIHandler::GetDropTarget()これじゃだめなん?
ドラッグソースになるのを制限する方法はわからない。

もしくは、
IDocHostUIHandler::EnableModelessあたり
0271267NGNG
>>270 さん
GetDropTargetでできました 情報ありがとうございます。
(EnableModeless の方は何でしょうか?)

ドラッグソースの抑止を引き続き募集しております
もしご存じの方いらっしゃいましたら情報宜しくお願いします。
0272デフォルトの名無しさんNGNG
>260さん
どうやってSDKで実装すればいいのでしょうか。
やり方載ってるページあったら紹介してくださいませんか。
0273デフォルトの名無しさんNGNG
VBでブラウザを作っているのですが、IEのオブジェクト上での右クリックで出てくるメニューを
表示させたくありません。
どのようにすれば規制できるか試行錯誤していますがなかなか解決できていません。

もし、よろしければご指導お願いします。

よろしくお願いしますm(_ _)m
0274デフォルトの名無しさんNGNG
カチュアゲ
0275SNGNG
微妙に息の長いスレだな。
0276デフォルトの名無しさんNGNG
273へご指導を。
0277デフォルトの名無しさんNGNG
>>276
何故過去レスを読みませんか?>>263
0278デフォルトの名無しさんNGNG
>>277
VBで、ってのがミソだね。
>>263と同じようにやればいいんだけど、やり方はだいぶ違う。
0279名無しさんNGNG
休日アゲ
0280デフォルトの名無しさんNGNG
user-agentとか偽装したり、
Range: bytes=10- とかコンテンツを途中から取得したり
するためにHTTP requestヘッダをいじりたいんだけど
どうしたらいい?おしえて、おねがい!
0281 NGNG
>280
Proxomitronが一番てっとり早い?カナ
0282280NGNG
>281
サンクス。
でも、プロキシとか使わずに
IEがリクエストを生成するときにフックされる形で
プログラムがリクエストを生成することはできないかな?

ちなみに、当方Win32SDKでやっております。
でIWebBrowsers2へのポインタも取得はできてます。
わかる方がいらしたら、教えてくださいまし。
0283デフォルトの名無しさんNGNG
ヘッダを置換する wsock32.dll を作る
0284280NGNG
>>283
それしかないっすか?
俺のスキルでは無理っぽいです。。。
ほかの手は無いのでしょうか?
0285デフォルトの名無しさんNGNG
ヘッダを置換する IE を作る
0286280NGNG
却下!次のかた、どうぞ。
0287デフォルトの名無しさんNGNG
>>284
かちゅ用のwsock32.dllのソース公開されているから
参考にしてみたら?
0288デフォルトの名無しさんNGNG
・URLが入力されたら、自分でHTTP経由でとってきて、
変換などをし、WebBrowserオブジェクトに表示させる
(各種2chブラウザみたいな方向。当然、img src等も
必要なら自前で処理する)

つーか、283ができねーようなら、これ以下は無理だろーが。
・間にパケットをいじるようなルータを入れる(自作)
・debugAPI等で、DLLをダイナミックパッチする
なんかの方法もあるな。
0289デフォルトの名無しさんNGNG
HTTPでファイル取得する程度ならwininet.dllで充分だな。
あれはUser-Agent指定できるし。
0290デフォルトの名無しさんNGNG
>>280
APP
だな。
0291280NGNG
答えてくれた皆さんありがとう。
ksockのソース見てちょっといじってみるよ。
0292デフォルトの名無しさんNGNG
MFCでWebオブジェクトにあるWeb(test.htmとする)を表示して、
それに対してGetLocationName(またはURL)すると、当然test.htmが
取得できますが、ユーザー操作(リンククリック)によって
test.htmの中にあるリンクページ(link.htm)にジャンプしてから、
GetLocationNameすると、link.htmが得られそうなのに、
test.htmが戻ってきますね。

Webオブジェクトに現在表示されている最新のURLを取得する方法はありますか?
0293デフォルトの名無しさんNGNG
IEのプラグインで
ウィンドウのリサイズイベントを取得する方法ってありますか?
DWebBrowserEvents2って
リサイズのイベント発行しないみたいなんですよね。
0294デフォルトの名無しさんNGNG
ExecWBを使って、現在表示されているURLを取得する方法ありますか?
教えてください
0295デフォルトの名無しさんNGNG
>>280
スタンダードに、
ローカルなプロキシを作るのがよい。
0296デフォルトの名無しさんNGNG
>>292
つか、donutのソースでも読んだら?
0297294NGNG
>>296
見たのですが難解でした。どなたかヒントください!!!

かなり、沼にはまってます
0298デフォルトの名無しさんNGNG
>267
まず聞きたいのは、donutのアドレスバーは、
君の望む動作をしたのか、ってことだ?
#まさか、該当htmファイルがフレームとか‥‥
0299267(本物)NGNG
?
0300297NGNG
>>298
す、するどい
フレームです。これが問題かも。
動作そのものは、GetLocationURLで問題なさそうですね。
となると、どう対処すればよいのやら・・・
0301デフォルトの名無しさんNGNG
るby!
0302298NGNG
>267 スマソ。間違い
>300
DWebBrowserEvent2::BeforeNavigate2あたりを捕まえるとか。
0303デフォルトの名無しさんNGNG
メモリ上に存在するhtmlや画像のレンダリングを行いたいのですが、やったことある人いますか?
htmlのレンダリングはDOM使って地道に組み立てるなりinsertAdjacentHTMLするなりで何とかなりそうなのですが、
画像のレンダリングはちょっと検討つきません。imgエレメントの読み込みを捕まえても仕方ないですし。
0304298NGNG
Pluggable Protocol Handlerを実装して、
<img src="memory://id48885251">とかやるとか。
0305デフォルトの名無しさんNGNG
Pluggable Protocol Handlerって面白い仕組みですね。今触っています。ありがとう!
0306デフォルトの名無しさんNGNG
続報です。Pluggable Protocol Handlerについて。
自分でプロトコルを実装するには
・レジストリに書き込んじゃう(OSグローバルなプロトコルになる。memory://....)
・IInternetSession::RegisterNameSpaceで一時的に登録する(アプリケーションローカル。プロトコルじゃなくてnamespaceが操作対象。http://memory/...とかやるのかな?)
という2つの方法があるっぽいです。
詳しくは下記URLで。
http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/pluggable/overview/appendix_a.asp
まだ全然コード書いていないので、詳しい検証はしていません。
「IInternetSession RegisterNameSpace」でGoogleして26件しか見つからん・・・
0307デフォルトの名無しさんNGNG
>>306
Pluggable Protocol Handlerを実装しちゃうと、
普通のホムーペからも呼び出せちゃうから、
セキュリティホールが空かないように気をつけてね。
0308デフォルトの名無しさんNGNG
コンポーネントじゃないんですが
P板の人ならと思い。。。

>セキュリティゾーンって幾つかあるけど新しく作ることは出来ないの?
>信頼済みは全て許可にしてるけど、スクリプトだけ許可したゾーンを
>作りたいんだよね。

わかりますか?
0309デフォルトの名無しさんNGNG
>>308
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\
レジストリでここに新しいゾーンを書き込んでみましたがダメでした。
ちょっと無理っぽいです。
0310デフォルトの名無しさんNGNG
>>309
それだとしたら、HKEY_CURRENT_USERの方じゃないか?
いや、試した訳じゃないけど。
0311310NGNG
おっ、試してみたらうまく行ったよ。> HKCU
0312デフォルトの名無しさんNGNG
IEコンポーネントで動いているJavaScriptから値をとりたいのですが
なにか良い方法ありませんか?
DHTMLで取ろうと思ったのですが、内容が変化した事を知る方法がわからないです・・・
0313312NGNG
独りでなんとかできそうです

bye
0314デフォルトの名無しさんNGNG
age
0315デフォルトの名無しさんNGNG
右クリックをすると「対象をファイルに保存」とでますが、
これはどれのコンポーネントに実装されているのでしょうか?
また、なんてメソッドでしょうか?
0316デフォルトの名無しさんNGNG
> 315
それ、IEじゃなくない?
0317デフォルトの名無しさんNGNG
>>315
よくわからないけど、ぱっと見で、
SHDOCVW.DLLの
DoFileDownloadかDoFileDownloadEx関数で出来そうな感じがする・・・
0318315NGNG
> 317
ど…どうやって調べるんですか?
DLLの中から関数を見つけるなんて…
0319デフォルトの名無しさんNGNG
>>318
このソフトで調べられるよ。
http://www.dependencywalker.com/
0320デフォルトの名無しさんNGNG
>>318
バイナリエディタで後ろの方を調べる、Win98の頃にあったクイックビューアを使うとか。
0321デフォルトの名無しさんNGNG
>>315
GoogleでDoFileDownloadを検索したら、
英語のサンプルがたくさん出てきたよ。
VBで試してみたらうまくいきました。
0322IUnknownNGNG
DoFileDownload は昔使ったことあったがDoFileDownloadExは
どうしてもパラメータがわからなかった。Undocumentedのようだし。。。

DoFileDownloadは呼び出しもとのプロセスが終了すると一緒に
終了してしまうが別プロセスで実行させるにはどうしたらいいんだろう?

今もこの2点はわからぬままなのである(未熟)。
0323デフォルトの名無しさんNGNG
> DoFileDownloadは呼び出しもとのプロセスが終了すると一緒に
> 終了してしまうが

IEのプロセスを終了するとダウンロードダイアログも終了するから
仕様だと思われ
0324デフォルトの名無しさんNGNG
IEも氷魚作品。5.01以降は茶番だよ
DX7いこうは糞。もうやつに関わらせるなって。
あいつにきいてみろ、それらしいやつうろちょろしてるはずだよ
今頃。
0325デフォルトの名無しさんNGNG
中身後悔してほしかったら、そのまえに
自分らでつくりなおせよってさ。

あいつのまねなんか普通誰もむりだって
とっとと奴につくらせろよなんか、決定的なのを
どうせいまごろばりえーしょん作りに夢中。
他人への教材のつもりらしいが他の奴らには
完成品にしかみえんだろうよ。たぶぶらうざ&
かちゅ全般。にちゃんはひおのてき製作。

・・・あいつの独壇場だよ。
正直やっとれんわ。
0326デフォルトの名無しさんNGNG
氷魚がこの板やPC業界を底上げしているけど、
本当は目覚しい人類の進歩でなくて氷魚の遺作。
多分メモリ展開解答あぷりにも関わっている奴。
セグメントぶちぬいて、ばいなりいじるのもうやめろと
氷魚にいっとけ!!かなり頭に来た。
日本人ならともかく、あいつは米系列だろう?
俺と同じで。
0327デフォルトの名無しさんNGNG
SiSにいまごろてーかしてるだろうから、
それらしいやつさがせ
128bitCPUに関わった奴だよ。
こんなの程度誰でも簡単とかぬかしてるやつだよ

あほ扱いされ過ぎて卑下しすぎ→電波、
0328デフォルトの名無しさんNGNG
>>324-327 よっぱらい? あふぉ

IEのコンポーネントっていうとみんなインターネットがらみの話になっているけれど
別にWinInet使うぐらいでもいいわけだから
もうちょっとOLEコンテナとしてのIEについて考えない?

例えばACTIVE-X使うときタイプライブラリーとか使わなくても
いきなりADOとかSAPIとか使えちゃうよね、

あとVBやdelphiと比較してユーザーインターフェース部分
htmlで実装するならばWEBデザイナーが使えるはず
これって基本クラスとして実装したら結構あとらくだと思うんだけど
0329デフォルトの名無しさんNGNG
>>328
ここのデンパが迷い込んだだけ
脳内あぼーん推奨
http://pc.2ch.net/test/read.cgi/prog/999284410/
0330328NGNG
>>329 なんだ。こいつは...ま いいか。

要はそこそこの性能で動いて、とりあえず法的に問題なくて
気が向いたら高速化できるスペックならいいんじゃない。

だからWININET まんせー
IEコンポーネント まんせー
0331デフォルトの名無しさんNGNG
ん? もしかして勘違いされた?
324-327はデムパだから脳内あぼーんしたほうがいいよという
つもりだったんだけど
0332デフォルトの名無しさんNGNG
IEコンポーネントでは、HTMLのTITLE="NANTOKA"でツールチップが表示されるけど、
表示までの時間を変更するにはどうするんでしょう?
0333デフォルトの名無しさんNGNG
WebBrowserコンポーネントで簡易ブラウザを作ろうとしているのですが
開いたページの大きさに合わせて、スクロールバーの出ないギリギリまで
縮めるようなことはできるのでしょうか。
つまり、そのギリギリのサイズをどうにか取得したいのですが。
環境はC++Builder4です。
0334ねこまNGNG
document->body->Scroll(Width|Height)
0335333NGNG
ありがとうございます〜。
まだちょっと動いてないですが、なんとか出来そうです。
0336333NGNG
…やっぱり出来ませんでした。

IHTMLDocument2* doc;
WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (void**)&doc);
IHTMLElement* body;
doc->get_body(&body);

でBODYエレメントまでは行くんですが、そこから先がどうすればいいのか解りません。
検索していろいろ試してみたのですが body->get_offsetHeight(&lHeight) というのだけ
動きましたがどうも違うようでした。
IHTMLElement2* で宣言できればScrollHeight等が得られそうなのですが、タイプライブラリを
取り込んでも未定義といわれてしまいました。

どなたかアドバイスお願いします。
0337デフォルトの名無しさんNGNG
to 333
http://n76cd-01p02.ppp11.odn.ad.jp/old/a4950.html
0338333NGNG
ありがとうございます。
実はそのページも見て試行錯誤していたのですが、まだうまくいっていませんです。

MSHTML::IHTMLElement2* pIHTMLElement2;

としても 「MSHTMLは名前空間ではない」とコンパイルエラーになってしまいます。
using namespace MSHTML;
とすると、「Namespace name expected」とエラーになりました。
名前空間に関してはいまいち理解できていません。

IHTMLElementでなんとかできないものかとやっていましたが、どうも
get_offsetHeight,Widthしかないようでした。

mshtml.h を見ても IHTMLElement2自体定義されていないようにも見えるのですが
どうすればいいのでしょう…。PlatformSDKが古いのかもしれませんがサイトに
行ってもスクリプトのエラーでページが表示されずDLできないので困っています。

何か解決策をご存知の方、お願いします。
0339デフォルトの名無しさんNGNG
1.IE5.0以上をインストールしていない
2.タイプライブラリを取り込んだ後MSHTML_TLB.Hをインクルードしてない。
3.それ以外。なんつったり
0340333NGNG
<MSHTML_TLB.H> インクルードしていませんでした。
タイプライブラリは取り込む(の処理)だけでいいと勘違いしていました。
本当にありがとうございます。

>337 のサイトに書いてあったのを参考にこうなりました。ほとんどパクリなのですが…。

long lHeight;
IDispatch* pDisp = WebBrowser1->Document;    // TWebBrowser *WebBrowser1;
IHTMLDocument2* pIHTMLDocument2;
pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pIHTMLDocument2);

IHTMLElement* pIHTMLElement;
pIHTMLDocument2->get_body(&pIHTMLElement);
IHTMLElement2* pIHTMLElement2;
pIHTMLElement->QueryInterface(IID_IHTMLDocument2, (void**)&pIHTMLElement2);
pIHTMLElement2->get_scrollWidth(&lHeight);

実はまだ動いていないので、もう少しだけお願いします。
このソースだと一番下のget_scrollWidthの行で読み込み違反が発生します。
同様の症状はDocumentを取得する際にまだそのサイトがロード中だった場合に
発生しましたが、今は一連の処理を READYSTATE_COMPLETE を待ってから
行っているので原因は違うようです。

何か心当たりがありましたら、宜しくお願いします。
0341333NGNG
すみません、修正です。一番下の行はget_scrollHeightの間違いです。
0342デフォルトの名無しさんNGNG
>QueryInterface(→IID_IHTMLDocument2, (void**)&pIHTMLElement2);
とか
>get_scrollWidth(→&lHeight);
は単なるtypoなのか?
0343333NGNG
__uuidof はMicrosoft特有の仕様なのでBCBでは使えませんでした。
代わりに IID_IHTMLDocument2 にしました。
ttp://isweb23.infoseek.co.jp/computer/wds/html_designer_code.shtml
↑こちらとか参考にしてみたのですが、問題あるかもしれないです。

WidthとHeightは、Widthで書いていたところを>337に合わせるため
Heightに修正したのですがget_scrollWidthだけ忘れていました。
get_scrollHeight(&lHeight)です。
0344IID_IHTMLElement2NGNG
でわ?
0345333NGNG
全くその通りでした。指摘していただいたというのに、お恥ずかしい…。
おかげさまで無事サイズを合わせることができました。本当に感謝です。
0346 NGNG
InternetOpenURLで以下のように複数行に渡るヘッダを追加することってできないの?
InternetOpenUrl(m_hInternetSession, URL,"A: a\r\n\tbbbb\r\n", strlen("A: a\r\n\tbbbb\r\n"), INTERNET_FLAG_RELOAD, (DWORD) this);
たしか、タブとかスペースが入ってたら複数行してもいいとHTTP1.1のRFCには書いてあった気がしたんですが、、、

僕の理解間違いかな?
それとも、wininetがサポートしてないだけ?
はたまた、やり方が違いますか?

お分かりになる方、助言をお願いします。
0347デフォルトの名無しさんNGNG
http://msdn.microsoft.com/workshop/networking/wininet/reference/functions/internetopenurl.asp
> lpszHeaders
> [in] Pointer to a string variable that contains the headers
> to be sent to the HTTP server. (For more information, see
> the description of the lpszHeaders parameter in the
> HttpSendRequest function.)

タブやスペースとはどこにも書いてませんが。
つーかどういうヘッダを追加したいのか不明。
0348346NGNG
だれもmsdnとはいってませんが。
RFCだっちゅうねん。
以下rfc2068抜粋。

HTTP header fields, which include general-header (section 4.5),
request-header (section 5.3), response-header (section 6.2), and
entity-header (section 7.1) fields, follow the same generic format as
that given in Section 3.1 of RFC 822 [9]. Each header field consists
of a name followed by a colon (":") and the field value. Field names
are case-insensitive. The field value may be preceded by any amount
of LWS, though a single SP is preferred. Header fields can be
extended over multiple lines by preceding each extra line with at
least one SP or HT. Applications SHOULD follow "common form" when
generating HTTP constructs, since there might exist some
implementations that fail to accept anything beyond the common forms.
0349デフォルトの名無しさんNGNG
とりあえず、HTTP応答でもみて、レイヤの切り分けをせんかい。
0350346NGNG
いや、
応答以前にセッションがNULLになってしまうんですよ。
単純にwininetがひとつのヘッダフィールドをtabで複数行連ねることを解釈できないのかな?
0351デフォルトの名無しさんNGNG
tabで複数行に分ける必要がどこにある?
継続行は実際には解釈しないクライアントが多いから1行で書けとどこかで見たぞ
0352デフォルトの名無しさんNGNG
>>340
> IDispatch* pDisp = WebBrowser1->Document;    // TWebBrowser *WebBrowser1;

333さんに質問です。
このTWebBrowserってどうやって使ってるんでしょう?
私も似たようなことをやろうと思って自分のソースに組み込んでるんですが、「定義されていない識別子です」。

#import <mshtml.tlb>
#include <mshtml_tlb.h>
はとりあえずしてます。
0353333NGNG
BCB4を使っていましたが、TWebBrowserは標準では登録されていませんでした。

[コンポーネント]→[ActiveXコントロールの取りこみ]で、「Microsoft Internet Controls」を
インストールすれば、コンポーネントパネルのActiveXタブにTWebBrowserが現れます。
あとは他のコンポーネント同様にフォームに貼りつけて使ってください。
0354333NGNG
ところで、#import が使えるということはBCB5ですよね。
TCppWebBrowserって標準でついてませんか?
0355デフォルトの名無しさんNGNG
お気に入りの表示回数とか最終表示日時って
どこに記録されてるんでしょうか?
0356デフォルトの名無しさんNGNG
http://bom-ba-ye.com/a.cgi?netapp=1
0357デフォルトの名無しさんNGNG
Desk Band を作ったんですが、IE だけで使いたいので
Explorer のツールバーに出させないようにするには
どうしたらよいのでしょう?
0358便乗NGNG
Desk Band で「クイック起動」みたいに1つだけしか作れないようにするには
どうしたらよいのでしょう?

タスクバー右クリック→[ツールバー(T)|クイック起動]
0359デフォルトの名無しさんNGNG
クリエイトプロセスでIEを起動して指定サイトを開くソースキボン。
0360デフォルトの名無しさんNGNG
>>357
レジストリで
noexplorer=1
0361デフォルトの名無しさんNGNG
普通ShellExecuteで標準のブラウザを開くと思うが・・・
まあいいや。
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof si);
si.cb = sizeof si;
CreateProcess("C:\Program Files\Internet Explorer\Iexplore.exe",
"iexplore http://www.2ch.net/",
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
0362デフォルトの名無しさんNGNG
>>358
///////////////////////////////////////////////////////////////////////////
//
// IPersistStream implementations
//
// This is only supported to allow the desk band to be dropped on the
// desktop and to prevent multiple instances of the desk band from showing
// up in the shortcut menu. This desk band doesn't actually persist any data.
//

STDMETHODIMP CDeskBand::GetClassID(LPCLSID pClassID)
{
*pClassID = CLSID_SampleDeskBand;

return S_OK;
}

STDMETHODIMP CDeskBand::IsDirty(void)
{
return S_FALSE;
}

STDMETHODIMP CDeskBand::Load(LPSTREAM pStream)
{
return S_OK;
}

STDMETHODIMP CDeskBand::Save(LPSTREAM pStream, BOOL fClearDirty)
{
return S_OK;
}

STDMETHODIMP CDeskBand::GetSizeMax(ULARGE_INTEGER *pul)
{
return E_NOTIMPL;
}
■ このスレッドは過去ログ倉庫に格納されています