OLE/SML#の概要

OLE/SML#を使うと、Microsoft COM/OLEオブジェクトにSMLからアクセスすることができます。

OLE/SML#は、FFI、LMLML、Finalizer、FLOBを使用しています。

構成

OLE2SML.exe
タイプライブラリをコマンドライン引数にとり、タイプライブラリに記述されたCOMオブジェクトにアクセスするSMLコードを生成します。
OLE.sml
COMにアクセスするためのベースライブラリ。

使用方法

OLE2SML.exeは指定されたタイプライブラリからSMLコードを生成します。

$ OLE.exe [options] TYPELIB_FILENAME
$ OLE.exe [options] ProgID

タイプライブラリは

  • タイプライブラリのファイルパス
  • タイプライブラリに記述されているCoclassのProgID

のいずれかで指定できます。

オプション:

-c CLASSNAME
指定された名前のCoclassまたはDispatchインタフェイスのラッパーコードのみを生成します。このオプションは複数回指定できます。-cオプションが指定されない場合、タイプライブラリ中のすべてのCoclassとDispatchインタフェイスに対するコードが生成されます。
-o FILENAME
出力先ファイル名を指定します。-oオプションが指定されない場合、タイプライブラリ名.smlが出力先となります。
-h
使用方法を表示します。

例として、Internet Explorer(=IE)を操作してみましょう。

まず、OLE2SML.exeを使って、IEのラッパーコードを生成します。

OLE2SMLはProgIDをコマンドライン引数にとります。IEのProgIDは"InternetExplorer.Application"です。

$ OLE2SML.exe InternetExplorer.Application

ProgIDの代わりに、タイプライブラリのファイルパスを指定することもできます。

$ OLE2SML.exe "C:\\WINDOWS\\System32\\shdocvw.dll"

タイプライブラリC:\WINDOWS\System32\shdocvw.dllはInternet Explorerが実装するCOMオブジェクトを記述しています。

デフォルトでは、OLE2SML.exeは指定されたタイプライブラリに記述されているすべてのcoclassとインタフェイスに対するラッパーコードを生成します。そのうちの一部のcoclassやインタフェイスだけを使用する場合、-cオプションで指定することで、生成するコード量を減らすことができます。

$ OLE2SML.exe -c InternetExplorer InternetExplorer.Application
$ OLE2SML.exe -c InternetExplorer "C:\\WINDOWS\\System32\\shdocvw.dll"

生成されたコードには、InternetExplorer coclassのラッパーコードだけが含まれます。

つぎのセッションは、IEのインスタンスを生成し、ホームページに移動します。

# use "OLE.sml";
    :
# OLE.initialize [OLE.COINIT_MULTITHREADED];
val it = () : unit

OLEライブラリをロードして初期化します。

# use "./SHDocVw.sml";
signature SHDocVw =
    :
end
structure SHDocVw : SHDocVw

IEのラッパーコードをロードします。ラッパーコードはタイプライブラリの名前でstructureを定義します。

# val IE = SHDocVw.newInternetExplorer ();
val IE =
   {
     :
   }
   : SHDocVw.InternetExplorer

IEのインスタンスを生成します。newcoclassが、coclassのコンストラクタ名となります。

# #getVisible IE ();
val it = false : bool
# #setVisible IE true;
val it = () : unit

IEのvisibleプロパティにアクセスします。

# #GoHome IE ();
val it = () : unit

IEのGoHomeメソッドを呼びます。

# #release IE ();
val it = 0wx0 : Word32.word

COMはオブジェクトのライフサイクルを参照カウントで管理します。OLE/SML#はCOMオブジェクトの参照カウントをSML#のGCを用いて内部的に管理するので、ユーザはaddRefreleaseを明示的に呼び出す必要はありません。ただし、この例の場合、IEオブジェクトへの参照がグローバルで束縛されています。グローバルな束縛はSML#のGCでは解放されないので、使用後にreleaseメソッドを呼んでグローバル参照を解放する必要があります。

# OLE.uninitialize ();
val it = () : unit

OLEライブラリの使用を終了します。

他の例

Last modified:2010/06/09 11:51:26
Keyword(s):
References:[OLE/SML#の概要] [開発ツール]