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の実現を以下のように変更しました.
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に呼び出される.
用VS2010开发支持MFC的office插件_第1张图片
次に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を開けて、その大きな笑顔をクリックして、なじみのあるウィンドウが見えます.
用VS2010开发支持MFC的office插件_第2张图片
注:初めて文章を送るので、前のスクリーンショットは保存してからアップロードするのではなく、直接貼り付けて、スクリーンショットがなくなってしまいます.どの手順が分からないなら、交流を歓迎します.
サンプルコードのダウンロード先: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