SML# - OLESMLSharpOverview Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

// 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のインスタンスを生成します。
'''new'''''coclass''が、''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を用いて内部的に管理するので、
ユーザは'''addRef'''と'''release'''を明示的に呼び出す必要はありません。
ただし、この例の場合、IEオブジェクトへの参照がグローバルで束縛されています。
グローバルな束縛はSML#のGCでは解放されないので、
使用後に'''release'''メソッドを呼んでグローバル参照を解放する必要があります。

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

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

!!他の例
*[[Internet Explorer|http://www.pllab.riec.tohoku.ac.jp/smlsharp/tools/OLE/sample/SHDocVwSample.sml]]
*[[Excel|http://www.pllab.riec.tohoku.ac.jp/smlsharp/tools/OLE/sample/ExcelSample.sml]]
*[[Windows Scripting|http://www.pllab.riec.tohoku.ac.jp/smlsharp/tools/OLE/sample/ScriptingSample.sml]]
*[[Late binding|http://www.pllab.riec.tohoku.ac.jp/smlsharp/tools/OLE/sample/DotNetSample.sml]]

!OLE/SML#に関する項目

*[[OLESMLSharpOverview]]
*[[mapping COM and SML#|http://www.pllab.riec.tohoku.ac.jp/hiki/smlsharp/?OLESMLSharpMapping]]
*[[API|http://www.pllab.riec.tohoku.ac.jp/smlsharp/tools/OLE/doc/api/]]
*[[COM in 3 minutes|http://www.pllab.riec.tohoku.ac.jp/hiki/smlsharp/?OLESMLSharpMiniGuideOfCOM]]
*[[Implementation overview|http://www.pllab.riec.tohoku.ac.jp/hiki/smlsharp/?OLESMLSharpImplementationOverview]]