ふにゃるん

2007-09-10 出遅れ気味〜

[][] IronPython 2.0 Alpha4 で追加された"-X:PreferComDispatch"オプションって、何の役に立つの? 23:56  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"と合わせて、一挙両得

という事です。はい。

SeasonsSeasons 2007/09/11 02:54 なんかこれだけでもデモやっている感じがしておもしろいですね。
RubyでもOLEを使えた時は、非常に感動しましたが、これはオペレーション
しながら且つ、DLRの魅力を説明できてウマーっすね。

ishisakaishisaka 2007/09/11 06:59 まいどどうも。
PowerShellでは出来ていたことなので、何時かやるんだろうなと思っていたら、入れてきましたね。
PowerShellを使いたくないシス管の人には朗報でしょう。

WackyWacky 2007/09/11 23:58 こんばんは。

Seasons さん
> なんかこれだけでもデモやっている感じがしておもしろいですね。
感想ありがとうございます。

実は最初、IDispatchを直接サポートって何じゃらほい?と思ってたんですが、サンプルソースとコマンドラインでポチポチ動きを追っかけている最中に、昔勉強した IDispatchのメソッドが頭に浮かんできて、「なるほど〜、そうやってるのか」と意味もなく膝ポンしてました。

ishisaka さん
> PowerShellでは出来ていたことなので...
翻訳ありがとうございます。
(そちらは、水びたしの件で、結構大変ですね…(オロオロ))

PowerShellでは出来てたんですね。う〜ん、手を出してなかったので、気付きませんでした。
今度、インストールしてみようかな…。