はじめまして
現在IE用のActiveXを作成しています。
OSはXP,Vista,7
IEは7と8を対象に考えています。
ActiveXの中でIWebBrowser2を作成しているのですが
IEを2つ(プロセスIDが2つ)起動した状態で
CComPtr<IWebBrowser2> pIE;
CoCreateInstance(CLSID_InternetExplorer,
(LPUNKNOWN)NULL,
CLSCTX_SERVER, IID_IWebBrowser2,
reinterpret_cast<LPVOID*>(&pIE));
を実行しpIEからプロセスIDを取得するとActiveXを実行したIEと違う
プロセスの方で作成しちゃってます。
これが当たり前なのでしょうか???
IE8に至ってはウィンドウが1つでもプロセスが2つあったりして困ってます。
CLSCTX_SERVERの部分をCLSCTX_INPROC_SERVERやCLSCTX_LOCAL_SERVERなどに
変更して試しましたが結果かわらず・・・
どなたか助けてください!!
直接的な回答ではありませんが・・・
CoCreateInstanceの説明をよく読めば、お解りなるかと。
例えば・・・
http://www5.plala.or.jp/atata/references/functions/CoCreateInstance.html
以上。参考まで
オショウさんありがとうございます。
教えていただいたサイトを読みながら学習中です。
やはりプロセスというと第三引数だと思うのですがCLSCTX_INPROC_SERVER等を
指定してみても別のプロセスになってしまいます。
あと、第二引数のIUnknownなのですが集約するという部分でなにやら
関係がありそうな・・・と思ってチャレンジ中です。
いったい何を(ActiveX自身?)指定すればよいのやらと試行錯誤中です。
IUnknownがいかなるものか調査してみます。
検討はずれのことを言っているようでしたらご指摘ください。
CLSCTX_INPROC_SERVERがインプロセス
CLSCTX_LOCAL_SERVERが同一マシンの別プロセスだということは
よくわかりました。
なのでCLSCTX_INPROC_SERVERを使用したいのですが
CLSID_InternetExplorerでCLSCTX_INPROC_SERVERで事項すると
CoCreateInstanceの戻りがE_FAILで「クラスが登録されていません」と
エラーが帰ってきました。
調べているとCLSID_InternetExplorerはCLSCTX_LOCAL_SERVERでないと
ダメみたいな書き込みが多かったです。
なせダメなのか?またCLSID_InternetExplorerをインプロセスでは利用できないのか?を現在調査しています。
以上、途中経過でした。
出張先からなもので・・・
> CoCreateInstanceは、ローカルシステムに1つだけオブジェクトを作成します。
とありますよネ?
その一文だけで、お解りになりませんか?
で・・・
> 1つのCLSIDから複数のオブジェクトを作成する場合、CoGetClassObjectを参照して下さい。
ともあります。
一度お試しください。
※ IE7以降、タブブラウザになり、挙動が以前とは変化しました。
その辺の影響もあるようです。
しかしながら、私は動作確認していませんもので。
以上。参考まで
オショウさんありがとうございます。
申し訳ないです、説明不足でした。
IEのプロセスが2つというのは単純にスタートメニューからIEを
起動しただけのものです(ActiveXからではありません)。
2つ目に起動したIEの自作ActiveXでCoCreateInstanceを一度だけ
行っているので作成しているオブジェクト(IWebBrowser2)も1つ
だけのつもりだったのですが・・・
教えていただいたサイトをもう一度じっくり呼んで出直してきます。
何度もご教授いだだきありがとうございます。
> 調べているとCLSID_InternetExplorerはCLSCTX_LOCAL_SERVERでないと
> ダメみたいな書き込みが多かったです。
> なせダメなのか?
CLSID_InternetExplorer がそういう作りをしているからです。
レジストリエディタを立ち上げて、HKEY_CLASSES_ROOT \ CLSID \ <CLSID_InternetExplorer の GUID 値> を見てください。
この下に InprocServer32 というキーがあれば、CLSCTX_INPROC_SERVER が使用可能です。
InprocServer32 がなく LocalServer32 しかなければ、CLSCTX_LOCAL_SERVER を使うしかありません。
> 第二引数のIUnknownなのですが集約するという部分でなにやら
> 関係がありそうな・・・と思ってチャレンジ中です。
まず関係ありません。
これは、COM で実装継承を使う場合に必要なのであって、COM コンポーネントを作る時に使うものです。
COM コンポーネントを使うときには NULL にします。
で、そもそもの問題として、プロセスを特定して作れないと何か不都合があるんでしょうか?
IE 上で動く ActiveX コントロールの中で IE を CoCreateInstance しているんですよね。
この時、CoCreateInstance は新しいインスタンスを作る関数なので、それで得たインスタンスと、今 ActiveX コントロールをホストしている IE のインスタンスは違う可能性があります。
もしも、ActiveX コントロールをホストしている IE のインスタンスがほしいのなら、こういう方法をとるみたいです。
http://support.microsoft.com/kb/257717/ja
aetosさん回答ありがとうございます。
>レジストリエディタを立ち上げて、HKEY_CLASSES_ROOT \ CLSID \ <CLSID_InternetExplorer の GUID 値> を見てください。
なるほど、そこを見るとわかるのですね!!!
まだまだ勉強不足です。
>で、そもそもの問題として、プロセスを特定して作れないと何か不都合があるんでしょうか?
不都合というか別の道もありそうなのですが、IEで動くAcitevXの中でIEをCoCreateInstanceしてそのIEのページから画像を作成したいのですがOleDrawが別プロセスのIEを元にした場合、E_FAILを返してくるんです。
結果、真っ黒な画像ができあがってしまうのです。
そもそもの実験としてスタートメニューから起動したIEが1つの場合は成功
2つの場合(2つ目でActiveXを実行)は失敗というところから始まりました。
IEが2つでも先に起動したIEで行えば問題ありませんでした。
で、CoCreateInstanceのプロセスIDを調べたところ別のIEになっていることが判明しました。
最終的にOleDrawが別プロセスのものでも失敗しなければそれでよいのですが
なかなかうまくいきません。
教えていただいたサイトも勉強になりそうなのでじっくり読んでみようと思います。
数日の間に脇道にそれてCoCreateInstanceではなくダイアログにWebBrowserコントロールを配置しそのコントロールに対して画像を作成(OleDraw)したところ、成功しました。
やはり別プロセスですかね・・・
機能的には用件を満たすのですが元のやり方もうまくいきたいので実験続行中です。!!
ツイート | ![]() |