言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

ActiveX コントロール(ブラウザプラグイン)の作り方

やりたい事

Internet Explorer 上でプラグインとしてスクイークを表示させるという事をやります。これはすでに Squeakland 版スクイークでは標準となっている機能ですが、あえてもう一度作り直します。と言うのも、Web ブラウザ上でプログラムを動かすという機能は、あちこちでよく見られるにも関わらず、旬が過ぎたからかドキュメントが見つからず非常に情報を入手するのに苦労するからです。巷の本屋では Windows 系の書籍は次第に .NET 系に移りつつあり、ActiveX は過去の知識となっています。ソースコードはこちら http://metatoys.org/pub/MyOcx/

基本

手元にある VisualStudio 2003 で作ります。名前は安易ですが「MyOcx」とします。

  • 新規作成 - プロジェクト
  • MFC ActiveX プロジェクトを選択。プロジェクトの名前を MyOcx とする。
  • コントロールの設定
    • バージョン情報を非選択
    • オブジェクトの挿入で使用を選択
  • いったんここで実行
    • テストコンテナで実行を選択
      • 編集 - コントロールの挿入
      • MyOcx Control を選択
    • テストコンテナの内容は保存しておくと後で楽。

ここで、やる気の無い円だけが表示されるコントロールが表示されます。

Internet Explorer 内に表示する

  • プロジェクトを選択し、新しい項目の追加
  • WEB - HTML ページ
  • 追加する HTML ページの名前を MyOcx.html とする。
  • ツールボックスの表示
  • 表示した MyOcx Control をドロップする。
  • MyOcx.html を選択してブラウザで表示

これで IE の中にやる気の無い円が表示されます。ただ VisualStudio の HTML 編集画面を開いておくと、VisualStudio を再起動するまでバイナリ (.ocx) を書き込み出来ないという事になるので、HTML は VisualStudio 内で開けない方が良いです。

パラメーターの取得

HTML文中にある PARAM 内の文字を取得する方法です。MyParam というパラメーターを追加します。

  • クラスビュー - MyOcxLib - _DMyOcx
  • 追加 - プロパティの追加
  • 戻り値 BSTR
  • プロパティ名 MyParam
  • メンバ変数を選択
  • CMyOcxCtrl::DoPropExchange に以下を追加(このあたり意味不明)
    • PX_String(pPX, _T("MyParam"), m_MyParam, "");

あとはここで作成されたメンバ変数 m_MyParam をプログラム中で使う事が出来るようになります。例えばパラメータを画面に表示するには、CMyOcxCtrl::OnDraw を編集して

	pdc->TextOut(0, 0, m_MyParam);

のような物を追加します。また、HTML は以下のようになります。プラグインの大きさを指定するには、_ExtentX _ExtentY を使用する他に、OBJECT タグの中で WIDTH HEIGHT 属性を利用する事も出来ます。

<HTML>
	<HEAD>
		<TITLE></TITLE>
		<META NAME="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
	</HEAD>
	<BODY>
		<OBJECT id="Dmyocx1" classid="clsid:240AB2F3-0F9B-418B-9939-724B83A97BB0" VIEWASTEXT>
			<PARAM NAME="_ExtentX" VALUE="5080">
			<PARAM NAME="_ExtentY" VALUE="2752">
			<PARAM NAME="MyParam" VALUE="This Is My First ActiveX">
		</OBJECT>
	</BODY>
</HTML>

Squeak を埋め込む

ここは ActiveX 自体とは関係のない知識です。Squeak の実行ファイルには、あらかじめプラグインとして動作させるための仕掛けがあるので簡単に他のアプリに埋め込む事が出来ます。具体的には、ウインドウハンドルという物を -browserWindow: オプションで渡します。ウインドウハンドルというとは、Windows の表示要素に一つずつ割り当てられたアドレスで、this->m_hWnd のようにして取得します。

この処理はプラグインが画面に開かれる時に行いたいので、COleControl::OnCreate をオーバーライドします。本当はパラメーターでイメージの位置などを指定するのが正しいと思いますが、面倒なので埋め込んでいます。

afx_msg int CMyOcxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	char hWndString[100];

	if (COleControl::OnCreate(lpCreateStruct) == -1)
		return -1;

	sprintf(hWndString, "%d", this->m_hWnd);

	_spawnl(_P_NOWAIT,
		"C:\\Program Files\\squeak\\Plugin\\Squeak.exe",
		"\"C:\\Program Files\\squeak\\Plugin\\Squeak.exe\"",
		"-browserWindow:",
		hWndString,
		"\"C:\\Program Files\\squeak\\Plugin\\SqueakPlugin.image\"",
		NULL
		);
	return 0;
}

また、メッセージマップに以下のように追加する必要があります。

BEGIN_MESSAGE_MAP(CMyOcxCtrl, COleControl)
	ON_WM_CREATE()

メッセージマップと言うのは何なのか良く分からないですが、多分 MFC の知識なのだろうと思います。