- PR -

【SWT】IEコンポーネントNewWindow2イベント

1
投稿者投稿内容
ナスカ
会議室デビュー日: 2007/10/04
投稿数: 7
投稿日時: 2007-11-29 20:18
よろしくお願いします。

SWTにてオリジナルのブラウザを作成しています。
機能が不足している為、「org.eclipse.swt.browser.Browser」クラスは
使用していません。
org.eclipse.swt.ole.win32.OleFrame
org.eclipse.swt.ole.win32.OleControlSite
org.eclipse.swt.ole.win32.OleAutomation
を使用してIEコンポーネントを呼んでいます。

環境は
jdk 1.5.0.11
eclipse 3.2
org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar
Windows XP Professonal SP2
IE 6.0 SP2
です。

そこで、IEコンポーネントのNewWindow2イベントが発生した際に新規ウインドウの
表示を禁止して、同じブラウザの別タブに表示するタブブラウザとしたいです。

新規ウインドウの表示をキャンセルし、新規タブブラウザウインドウを作成するまで
はできましたが、遷移先のURLを取得できず、新規タブでのリクエスト先が指定
できません。

ちなみにNewWindowイベントとNewWindow3イベントならパラメータに遷移先URLが
あるのですが、NewWindowイベントはイベントが発生する条件がわからず、
NewWindow3イベントはWinXP SP2からでないと存在しません。
(Win2kも動作保証となっています)

VC++でIDispatchインターフェースのポインタを新規タブへ渡す事で実装している
情報はありましたが、知識不足のため、javaに置き換えて考えられませんでした。
(参照元記事URL)

NewWindow2イベントが発生した際に新規ウインドウの表示を禁止して、
同じブラウザの別タブに表示する機能の実現方法があればご教示ください。

よろしくお願いします。
FE
会議室デビュー日: 2002/05/24
投稿数: 9
投稿日時: 2007-12-03 18:22
NewWindow2で返すべきIDispatchは、
OleAutomation auto = new OleAutomation(site); //siteは別タブのOleControlSite
int[] id = auto.getIDsOfNames(new String[] {"Application"});
Variant v = auto.getProperty(id[0]);
auto.dispose();
IDispatch d = v.getDispatch();
こんな感じで取れます。
event.arguments[0]にセットする際は、
event.arguments[0].setByRef(d.getAddress());
と、アドレスをsetByRefで。
(Cancel=arguments[1]は、遷移をキャンセルするのであればsetByRef(true)で)
ナスカ
会議室デビュー日: 2007/10/04
投稿数: 7
投稿日時: 2007-12-03 18:32
FEさん、回答ありがとうございます。

引用:
int[] id = auto.getIDsOfNames(new String[] {"Application"});
Variant v = auto.getProperty(id[0]);



これが知りたかった事です!!
ありがとうございます!!

まだ、試せていませんが、試したらまた、結果を報告させていただきます。
ナスカ
会議室デビュー日: 2007/10/04
投稿数: 7
投稿日時: 2007-12-04 15:50
ご報告が遅れましたが、試してみました。

新しいタブのBeforeNavigate2イベントで
event.arguments[0].setByRef(d.getAddress());
を行うと
org.eclipse.swt.SWTException: Failed to change Variant type
が発生して終了してしまいます。

取得したIDispatchは新しいタブにどのタイミングでどのように実装すればいいのでしょうか?

よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)