続・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
-
- 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: };