Word2010で苦戦(その2)

Word2010のActive-Xコントロールの件ですが、やっと原因がわかりました.なんとActive-Xの実装の問題でした.
 
解析してみたのですが次のようになります.まずWord2010ですが、ALT+I+Oでオブジェクトの挿入ダイアログを出すと、ExcelなどのOLEサーバーアプリケーションは出てきてもActive-Xコントロールは出てきてくれません.しかたがないので、Word2003で同じことをやって、マシンにインストールしたCGM Viewerの評価版のActiveXコントロールを挿入しました.このActive-XにはCGM画像をドロップ&ドラッグして表示をさせます.ここで出力を.xml(WordML)にして保存します.そして、Word2010でこれを読み込んで、内容が表示されるのを確認してから、これを.docx形式で保存します.この.docxの拡張子を.zipに変えて中をのぞいてみました.するとやはりOLEのネイティブデータは出力されていません.しかしその代わりに、word/activeX/activeX1.xmlに次のようなデータが出現します.
 
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ax:ocx ax:classid="{Active-XのGUID}" ax:persistence="persistPropertyBag" xmlns:ax="http://schemas.microsoft.com/office/2006/activeX" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><ax:ocxPr ax:name="_Version" ax:value="65536"/><ax:ocxPr ax:name="_ExtentX" ax:value="0"/><ax:ocxPr ax:name="_ExtentY" ax:value="0"/><ax:ocxPr ax:name="_StockProps" ax:value="97"/><ax:ocxPr ax:name="SRC" ax:value="D:\My Documents\test_acx\smile1.cgm"/><ax:ocxPr ax:name="OFFSETX" ax:value="7.96768782469689E-36"/><ax:ocxPr ax:name="OFFSETY" ax:value="7.96768782469689E-36"/><ax:ocxPr ax:name="SCALE" ax:value="2.81094259249917E-34"/><ax:ocxPr ax:name="ROTANGLE" ax:value="0"/><ax:ocxPr ax:name="_CURRFILE" ax:value="D:\My Documents\test_acx\smile1.cgm"/><ax:ocxPr ax:name="_USEFUL" ax:value="2006"/><ax:ocxPr ax:name="FIXED" ax:value=""/></ax:ocx>
 
見ればわかるとおりax:ocxPr要素でActive-Xのプロパティが保存されています.Word2003の場合はこのようなことはなくBASE64のネイティブデータが出力されていました.Word2010になってActive-Xの保存方法が変わったようです.
 
考えてみたらそもそもActive-Xコントロールは「プロパティがネイティブデータそのもの」のはずです.OLEオブジェクトと違って、Active-Xコントロールはプロパティさえセットすれば動作できなければなりません.ところが私の使用していた自社製のActive-Xはプロパティを実装していませんでした.そして本来プロパティで持つべきデータをシリアライズでネイティブデータに書き込んでいました.このためWord2010では、データの保存のしようがなく不正表示になっていたようです.
 
またこれで、AddOLEControlでは動かず、AddOLEObjectでは動いたのも理解できます.OLEオブジェクトは、個々にサーバアプリケーションのデータをネイティブデータに保存しなければなりません.ですからWord2010もOLEオブジェクトの場合は、自社製のActive-Xコントロールもネイティブデータを保存していたのです.
 
なにか相当難しいことだと考えていたのですが、OLEオブジェクトとActive-Xコントロールの違いさえ理解していればわかることでした.Active-Xは実装を直して別のコントロールとして新規登録する必要があります.
いろいろドタバタしましたが、やはりプログラマにとって必要なのは「常識力」であると痛感しました.