VSB 2010でMFC対応のofficeプラグインを開発
8717 ワード
この文章はオリジナルです.転載は出典を明記してください.http://blog.csdn.net/banket004
インターネット上の文章を参考にして、自分の模索を加えて、多くの回り道をして、ようやくVSL 2010でMS Office 2007のプラグインを開発しました.この文をアップロードして忘れを準備します.
以下はExcelプラグインの開発を例にとって、他のofficeプラグインの開発過程は類似しています.
MFCをサポートする必要がない場合は、この記事を参照してください.http://blogs.msdn.com/b/jensenh/archive/2006/12/08/using-ribbonx-with-c-and-atl.aspx私は実験しました.
まずMFCをサポートするATL DLLソリューションを作成し、界面は以下の通りである.
「Allow merging of proxy/stub code」と「Support MFC」の2つの選択肢の前にチェックを入れてから「Finish」をクリックして、ここで最初の解決策が完成しました.続いてクラスガイドを通してプロジェクトに「ATL Simple Object」の種類を追加します.類名を入力する以外に、「ISuport ErroInfo」のオプションは下記の通りにできます.
次に上で作成したATLクラスCxcentaddinでライブラリ「Microsoft Add-Inn Designer<1.0>」の「_IDTExtensionity 2」インターフェースを実現します.このインターフェースの「OnConnection」「OnDisconnection」「OnAddInsUpdate」、「OnStation Comput.このソフトウェアの実行方法とShinett.Onfontince.Onworket.があります.
以上の操作は「Implement Interface Wizard」で完成できます.
ここまではExcelソフトウェアのインターフェースでプラグインを見ることができません.また、次のインターフェースを実現する必要があります.
それともクラスCxcercedenでインターフェースを実現し、インターフェースを通じてガイドを実現し、「Microsoft Office 12.0 Object Library<2.4>」ライブラリ(office 2007バージョンでは12)を選択し、「IRIbron Extensity」インターフェースを追加します.
インターフェースを追加してコンパイルしたら、以下のエラーが発生します.
1>d:\my documents\visual studio 2010\projectis\2007 excentaddin\2007 excersaddin\stdafx.h(41):warning C 4278:'RGB':identifer in type library'C:Program Files\Common Files\Microsoft\12use the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\project\2007 exceraddin\2007 exceraddin\debug\mso.tlh(2082):error C 2011:'IAccess ible':'s'structt'tyrefinition 1 c:\program files\microsoff sdks\windows\v 7.0 a\include\oleacc.h(556):see declaration of'IAccess ible'1>d:\my documents\visuess studio 2010\projects\2007 exceden
エラーメッセージのヒントによって、大体の意味は「Iaccessible」という構造体重が定義されました.stdafx.hファイルの中の
葃import「C:\Program Files\Common Files\Microsoft Shared\OFFICEE 12\MSO.DLL」raw_インターフェースonly、raw_native_types,no_namespace,named_guids,aut_search
せいにする
葃import「C:\Program Files\Common Files\Microsoft Shared\OFFICEE 12\MSO.DLL」raw_インターフェースonly、raw_native_types,no_namespace,named_guids,aut_search rename(「IAccess ible」「IMS OAccess ible」)
このエラーを解消できます.
Get Custoom UIの実現を以下のように変更しました.
HKCR{My2002007 excececededin.exceraddin.1=s'Excecel Addin Class'{CLSID=s'{0 F 1 D 1573 C-61FE-4 E 6-BBA 2-7 D 12 D 12 D 16 D 37 D 6 D 37 D 9 DAC'}My2007excedeaddin.excededididin=s Excececedededededededededin=s ExExcececel Addin Cdededededededededededededededededededededededededededededededededededededededededededin=s=s's Excess Addin=s ExExcess Addin CRemove CLSID{Force Remove}{0 F 173 C-61 FE-4 E 6-BBA 2-7 D 16 D 37 C 9 DAC}=s'exceraddin Class'{Force Remove Programmable InprocServer 32=s'%MODULE%'{ val ThreadingModel=s'Aartment'}Type Lib=s'{D 4 E 1923 A-0 F 0-B 00 E-32978 D 0 E 8 C 66}'Verssion=s'1.0's
赤い部分に注意してください.間違っていないようにしてください.そうでないとプラグインが動作しません.ここに行けばプラグインが表示されます.効果図を晒してください.
運転はできますが、ボタンを押すとエラーが発生します.これからもトラブルです.
=====================================================>>>>
まず、インタフェースIexcelladdinにパラメータをIDispatch*のOnStartメソッドを追加することにより、この方法はGet Custoom UI関数におけるonActionに呼び出される.
次にOnStartメソッドにテストコードを追加します.この方法が実行されているかどうかを確認しやすいです.この例では直接にパチンコヒントを追加します.
注:初めて文章を送るので、前のスクリーンショットは保存してからアップロードするのではなく、直接貼り付けて、スクリーンショットがなくなってしまいます.どの手順が分からないなら、交流を歓迎します.
サンプルコードのダウンロード先:http://download.csdn.net/detail/banket004/5891395
本論文は以下の文章を参照してください.
http://www.vckbase.com/index.php/wv/1442
http://www.vckbase.com/index.php/wv/1452
http://blogs.msdn.com/b/jensenh/archive/2006/12/08/using-ribbonx-with-c-and-atl.aspx
インターネット上の文章を参考にして、自分の模索を加えて、多くの回り道をして、ようやくVSL 2010でMS Office 2007のプラグインを開発しました.この文をアップロードして忘れを準備します.
以下はExcelプラグインの開発を例にとって、他のofficeプラグインの開発過程は類似しています.
MFCをサポートする必要がない場合は、この記事を参照してください.http://blogs.msdn.com/b/jensenh/archive/2006/12/08/using-ribbonx-with-c-and-atl.aspx私は実験しました.
まずMFCをサポートするATL DLLソリューションを作成し、界面は以下の通りである.
「Allow merging of proxy/stub code」と「Support MFC」の2つの選択肢の前にチェックを入れてから「Finish」をクリックして、ここで最初の解決策が完成しました.続いてクラスガイドを通してプロジェクトに「ATL Simple Object」の種類を追加します.類名を入力する以外に、「ISuport ErroInfo」のオプションは下記の通りにできます.
次に上で作成したATLクラスCxcentaddinでライブラリ「Microsoft Add-Inn Designer<1.0>」の「_IDTExtensionity 2」インターフェースを実現します.このインターフェースの「OnConnection」「OnDisconnection」「OnAddInsUpdate」、「OnStation Comput.このソフトウェアの実行方法とShinett.Onfontince.Onworket.があります.
以上の操作は「Implement Interface Wizard」で完成できます.
ここまではExcelソフトウェアのインターフェースでプラグインを見ることができません.また、次のインターフェースを実現する必要があります.
それともクラスCxcercedenでインターフェースを実現し、インターフェースを通じてガイドを実現し、「Microsoft Office 12.0 Object Library<2.4>」ライブラリ(office 2007バージョンでは12)を選択し、「IRIbron Extensity」インターフェースを追加します.
インターフェースを追加してコンパイルしたら、以下のエラーが発生します.
1>d:\my documents\visual studio 2010\projectis\2007 excentaddin\2007 excersaddin\stdafx.h(41):warning C 4278:'RGB':identifer in type library'C:Program Files\Common Files\Microsoft\12use the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\projectis\2007 exceraddin\2007 excentdin\stdafx.h(41):warning C 4278:'RGB':identife in type library'C:Progrmonsuse the'rename'qualifer 1>d:\my documents\visual studio 2010\project\2007 exceraddin\2007 exceraddin\debug\mso.tlh(2082):error C 2011:'IAccess ible':'s'structt'tyrefinition 1 c:\program files\microsoff sdks\windows\v 7.0 a\include\oleacc.h(556):see declaration of'IAccess ible'1>d:\my documents\visuess studio 2010\projects\2007 exceden
エラーメッセージのヒントによって、大体の意味は「Iaccessible」という構造体重が定義されました.stdafx.hファイルの中の
葃import「C:\Program Files\Common Files\Microsoft Shared\OFFICEE 12\MSO.DLL」raw_インターフェースonly、raw_native_types,no_namespace,named_guids,aut_search
せいにする
葃import「C:\Program Files\Common Files\Microsoft Shared\OFFICEE 12\MSO.DLL」raw_インターフェースonly、raw_native_types,no_namespace,named_guids,aut_search rename(「IAccess ible」「IMS OAccess ible」)
このエラーを解消できます.
Get Custoom UIの実現を以下のように変更しました.
STDMETHOD(GetCustomUI)(BSTR RibbonID, BSTR * RibbonXml)
{
if (!RibbonXml)
return E_POINTER;
*RibbonXml = SysAllocString(
_T("")
_T(" ")
_T(" ")
_T(" " )
_T(" " )
_T(" ")
_T(" ")
_T(" ")
_T(" ")
_T(" ")
);
return (*RibbonXml ? S_OK : E_OUTOFMEMORY);
}
同時にまず_をIDTExtensiobility 2インターフェースに対応する4つの方法「OnConnection」などを以下のように変更しました.STDMETHOD(OnConnection)(LPDISPATCH Application, ext_ConnectMode ConnectMode, LPDISPATCH AddInInst, SAFEARRAY * * custom)
{
return S_OK;
}
STDMETHOD(OnDisconnection)(ext_DisconnectMode RemoveMode, SAFEARRAY * * custom)
{
return S_OK;
}
STDMETHOD(OnAddInsUpdate)(SAFEARRAY * * custom)
{
return S_OK;
}
STDMETHOD(OnStartupComplete)(SAFEARRAY * * custom)
{
return S_OK;
}
STDMETHOD(OnBeginShutdown)(SAFEARRAY * * custom)
{
return S_OK;
}
つまり各関数のreturn E_NOTIMPL;
に変更するreturn S_OK;
この時最も機能が簡単なプラグインは基本的に完成しましたが、このプラグインはまだ彼の宿主が誰か分かりません.エクセルですか?それともWordですか?これは「exceraddin.rgs」のファイルを修正する必要があります.レジストリにプラグイン情報を登録するのは担当しています.このファイルの原本の内容は大体以下の通りです.HKCR
{
NoRemove CLSID
{
ForceRemove {0F1D173C-61FE-44E6-BBA2-7D16D37C9DAC} = s 'exceladdin Class'
{
ForceRemove Programmable
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
TypeLib = s '{D4E1923A-0EF0-42B2-B00E-32978D0E8C66}'
Version = s '1.0'
}
}
}
文章によるとhttp://www.vckbase.com/index.php/wv/1442中の説明は、Excelプラグインに対して、ファイルに以下のコードを追加します.HKCU
{
Software
{
Microsoft
{
Office
{
Excel
{
Addins
{
'My2007exceladdin.exceladdin'
{
val FriendlyName = s 'Excel2007 Addin'
val Description = s 'Excel2007 Addin'
val LoadBehavior = d '00000003'
val CommandLineSafe = d '00000001'
}
}
}
}
}
}
}
コンパイルした後、excel 2007を実行していますが、このプラグインが見つかりませんでした.まだ何か足りないかもしれません.以上の参考文献のソースコードの研究を通して、文章の一部が少なくなっていることが分かりました.また、rgsファイルのHKCR部分にコードを追加して、修正後はこのようになります.HKCR{My2002007 excececededin.exceraddin.1=s'Excecel Addin Class'{CLSID=s'{0 F 1 D 1573 C-61FE-4 E 6-BBA 2-7 D 12 D 12 D 16 D 37 D 6 D 37 D 9 DAC'}My2007excedeaddin.excededididin=s Excececedededededededededin=s ExExcececel Addin Cdededededededededededededededededededededededededededededededededededededededededededin=s=s's Excess Addin=s ExExcess Addin CRemove CLSID{Force Remove}{0 F 173 C-61 FE-4 E 6-BBA 2-7 D 16 D 37 C 9 DAC}=s'exceraddin Class'{Force Remove Programmable InprocServer 32=s'%MODULE%'{ val ThreadingModel=s'Aartment'}Type Lib=s'{D 4 E 1923 A-0 F 0-B 00 E-32978 D 0 E 8 C 66}'Verssion=s'1.0's
赤い部分に注意してください.間違っていないようにしてください.そうでないとプラグインが動作しません.ここに行けばプラグインが表示されます.効果図を晒してください.
運転はできますが、ボタンを押すとエラーが発生します.これからもトラブルです.
=====================================================>>>>
まず、インタフェースIexcelladdinにパラメータをIDispatch*のOnStartメソッドを追加することにより、この方法はGet Custoom UI関数におけるonActionに呼び出される.
次にOnStartメソッドにテストコードを追加します.この方法が実行されているかどうかを確認しやすいです.この例では直接にパチンコヒントを追加します.
STDMETHODIMP Cexceladdin::OnStart(IDispatch* RibbonControl)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your implementation code here
MessageBox(NULL, _T("Test"), _T("Excel"), MB_OK);
return S_OK;
}
最後に、「exceraddin.h」ファイルを開いて、マクロコードをマッピングする部分を見つけて、「COM_INTERS FACE_uENTRY 2」を追加します.BEGIN_COM_MAP(Cexceladdin)
COM_INTERFACE_ENTRY(Iexceladdin)
COM_INTERFACE_ENTRY2(IDispatch, Iexceladdin)// , , Ribbon
COM_INTERFACE_ENTRY2(IDispatch, _IDTExtensibility2)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(_IDTExtensibility2)
COM_INTERFACE_ENTRY(IRibbonExtensibility)
END_COM_MAP()
ここにボタンを押したイベントはほぼ完成しました.コンパイルした後、再度Excel 2007を開けて、その大きな笑顔をクリックして、なじみのあるウィンドウが見えます.注:初めて文章を送るので、前のスクリーンショットは保存してからアップロードするのではなく、直接貼り付けて、スクリーンショットがなくなってしまいます.どの手順が分からないなら、交流を歓迎します.
サンプルコードのダウンロード先:http://download.csdn.net/detail/banket004/5891395
本論文は以下の文章を参照してください.
http://www.vckbase.com/index.php/wv/1442
http://www.vckbase.com/index.php/wv/1452
http://blogs.msdn.com/b/jensenh/archive/2006/12/08/using-ribbonx-with-c-and-atl.aspx