ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

IronPython 2.0 Alpha4 で追加された"-X:PreferComDispatch"オプションって、何の役に立つの?

IronPython 2.0 Alpha4が出ました。

早速、OPC Dialyさんの所で簡単に訳してもらっています。(英語ダメぽな私にとって、とっても有難いっす)


で、ここで言及されている、"-X:PreferComDispatch"オプションなんですが、説明では、以下のように解説されています。

-X:PreferComDispatch起動オプション。IDispatchインターフェイスをもつCOMコンポーネントを直接操作可能にするオプション。つまり、ラッパアセンブリの事前作成がいらない。


百聞は一見に如かず。まずは、試してみましょう。
IronPython1
IronPython1 posted by (C)wacky

…判ります?


以前、私が書いたネタでは、以下のように作業して、初めてActiveXが使えていました。

  1. "tlbimpコマンド"を使って、COMオブジェクトを.NETで読める形式に変換
  2. clr.AddReferenceToFile("変換したファイル")とし、ActiveXを制御する


しかし、"-X:PreferComDispatch"オプションを使うと、以下のように直接Excelを制御する事ができます。

import clr
from System import Type, Activator
t = Type.GetTypeFromProgID("Excel.Application")
ex = Activator.CreateInstance(t)
ex.Visible = True
wd = ex.Workbooks.Add()
ws = wd.Sheets[1]
for y in range(1, 10):
  ws.Cells[y, 1].Value = y

IronPython2
IronPython2 posted by (C)wacky


ちなみに、IDispatchインタフェースのダイレクトサポートしていると言うだけあって、オブジェクトに対して dir する事ができます。
(きっと内部で、IDispatch::GetIDsOfNamesメソッド or IDispatch::GetTypeInfoメソッド を呼び出しまくりんぐでしょう)

>>> import clr
>>> from System import Type, Activator
>>> t = Type.GetTypeFromProgID("Excel.Application")
>>> ex = Activator.CreateInstance(t)
>>> dir(ex)
['ActivateMicrosoftApp', 'ActiveCell', 'ActiveChart', 'ActivePrinter', 'ActiveSh
eet', 'ActiveWindow', 'ActiveWorkbook', 'AddChartAutoFormat', 'AddCustomList', '
<略>
ection', 'SendKeys', 'SetDefaultChart', 'Sheets', 'SheetsInNewWorkbook', 'ShowCh
artTipNames', 'ShowChartTipValues', 'ShowToolTips', 'ShowWindowsInTaskbar', 'Sta
ndardFont', 'StandardFontSize', 'StartupPath', 'StatusBar', 'TemplatesPath', 'Th
isWorkbook', 'ToString', 'Top', 'TransitionMenuKey', 'TransitionMenuKeyAction',
'TransitionNavigKeys', 'Undo', 'Union', 'UsableHeight', 'UsableWidth', 'UserCont
rol', 'UserLibraryPath', 'UserName', 'VBE', 'Value', 'Version', 'Visible', 'Vola
tile', 'Wait', 'Width', 'WindowState', 'Windows', 'WindowsForPens', 'Workbooks',
 'WorksheetFunction', 'Worksheets', '_Default', '_Evaluate', '_Run2', '__class__
', '__delattr__', '__doc__', '__getattr__', '__getattribute__', '__getitem__', '
__hash__', '__init__', '__module__', '__new__', '__nonzero__', '__reduce__', '__
reduce_ex__', '__repr__', '__setattr__', '__str__']

"-X:TabCompletion"オプションと合わせて使うと、補完機能が働いて、まさしくウマーな状態です。

要するに

  • "-X:PreferComDispatch"を使うと、tlbimpを使わなくてOK
  • "-X:TabCompletion"と合わせて、一挙両得

という事です。はい。