桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

続・VC++8.0以降でOLEオートメーション

d:id:youandi:20100218:p2
しこしこツール作成をしていたら、何故がI/Fが見つからないという例外が多発してまともに動作しない。調べていたらようやく原因を発見。


VisualStudio 2005のVC++8.0で「Typelib からの MFC クラス」より「Typelib からのクラス追加ウィザード」で「Microsoft Word XX.X Object Library」を選んでWord2007のOLEラッパークラスを追加する場合、選択したクラスが1つずれて生成される事象が発生していた。

    • GUI上では「CKeyBinding」クラスを生成した筈なのに、下記のソースコードのコメントにある通り「Interior メソッド」のI/Fが出力されてしまっています。
    • Word2007の場合は、アルファベット順でKeyBinding以降のラッパークラスの出力を行うと選択したクラスの1つ前のクラスI/Fが出力されてしまうようです。VisualStudio 2008では大丈夫でした。
    • それから、VisualStudio 2005と2008とでWord2007の全てのラッパークラスを生成した場合、生成されるクラス数も違っているという事象も発生。2005では356個に対して、2008では354個。2005だとダブってクラスが生成されている模様。VisualStudio 2008がまともな挙動をする。


そこそこ動作するようになって、OLEオートメーションの実装サンプルどこ?と思ったのですが、普通にVBAマクロの記録でVBAコードをC++に変換するのが手っ取り早いな。

// [Typelib クラス追加ウィザード] で作成された IDispatch ラッパー クラスを生成しました。

#import "C:\\Program Files\\Microsoft Office\\Office12\\MSWORD.OLB" no_namespace
// CKeyBinding ラッパー クラス

class CKeyBinding : public COleDispatchDriver
{
public:
  CKeyBinding(){} // COleDispatchDriver 既定のコンストラクタを呼び出します。
  CKeyBinding(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
  CKeyBinding(const CKeyBinding& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

  // 属性
public:

  // 操作
public:


  // Interior メソッド
public:
  VARIANT get_Color()
  {
    VARIANT result;
    InvokeHelper(0x60020000, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
    return result;
  }
  void put_Color(VARIANT& newValue)
  {
    static BYTE parms[] = VTS_VARIANT ;
    InvokeHelper(0x60020000, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
  }
  VARIANT get_ColorIndex()
  {
    VARIANT result;
    InvokeHelper(0x60020002, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
    return result;
  }
  void put_ColorIndex(VARIANT& newValue)
  {
    static BYTE parms[] = VTS_VARIANT ;
    InvokeHelper(0x60020002, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
  }
  VARIANT get_InvertIfNegative()
  {
    VARIANT result;
    InvokeHelper(0x60020004, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
    return result;
  }
  void put_InvertIfNegative(VARIANT& newValue)
  {
    static BYTE parms[] = VTS_VARIANT ;
    InvokeHelper(0x60020004, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
  }
  VARIANT get_Pattern()
  {
    VARIANT result;
    InvokeHelper(0x60020006, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
    return result;
  }
  void put_Pattern(VARIANT& newValue)
  {
    static BYTE parms[] = VTS_VARIANT ;
    InvokeHelper(0x60020006, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
  }
  VARIANT get_PatternColor()
  {
    VARIANT result;
    InvokeHelper(0x60020008, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
    return result;
  }
  void put_PatternColor(VARIANT& newValue)
  {
    static BYTE parms[] = VTS_VARIANT ;
    InvokeHelper(0x60020008, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
  }
  VARIANT get_PatternColorIndex()
  {
    VARIANT result;
    InvokeHelper(0x6002000a, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
    return result;
  }
  void put_PatternColorIndex(VARIANT& newValue)
  {
    static BYTE parms[] = VTS_VARIANT ;
    InvokeHelper(0x6002000a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
  }
  LPDISPATCH get_Application()
  {
    LPDISPATCH result;
    InvokeHelper(0x94, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
  }
  long get_Creator()
  {
    long result;
    InvokeHelper(0x95, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
    return result;
  }
  LPDISPATCH get_Parent()
  {
    LPDISPATCH result;
    InvokeHelper(0x96, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
  }

  // Interior プロパティ
public:

};