COMを応用してExcelをコントロール

Slides:



Advertisements
Similar presentations
データベースの基礎知識 ACEESS の基本操作. データベースの基礎知識 データベース  特定のテーマや目的に毎のデータの集合体 データベースソフトウェア  データベースを作成、管理するソフトウェアの総 称 Oracle(Oracle) IBM(DB2) Microsoft(SQL Server)
Advertisements

Windows 入門 2007 年 7 月 17 日 マルチメディアセンター 重歳 憲治. 2007/07/17 Windows 入門 2 講習会概要 Windows XP Professional (ノートパソコ ン)を使って,コンピュータを使用する上で 必要な基礎知識,基本操作について実習形式.
1 WORD の起動法と終了法 ● WORD の起動法 (1) デスクトップの Microsoft Word アイ コンをダブルクリックする。 * (2) 「スタート」 ― 「すべてのプログラ ム」 ― 「 Microsoft Word 」と選ぶ。 (3) Word で作成された文書があるとき は、そのアイコンをダブルクリック.
情報処理 第8回第8回第8回第8回. 目次 (1) スタイルの利用 – スタイルの概要 – スタイルの適用 (1) – 「スタイル」ウィンドウを開く – スタイルの適用 (2) – スタイル適用のセオリー – すべてのスタイルを表示 – スタイルの書式を変える (1) – スタイルの書式を変える (2)
Microsoft Office 2010 クイックガイド ~OneNote編~
情報基礎演習I(プログラミング) 第9回 6月22日 水曜5限 江草由佳
Microsoft Office クイックガイド ~Excel 2013~
BBT大学 Ruby on Rails開発環境セットアップマニュアル
イベント イベント: マウスの操作、キーボードの操作、ファイル操作など システムやユーザーからの入力・出力のこと
応用コース:ワープロを活用する WORD2000 1回目 基礎コースの復習(第1章と付録) 2回目 文字の入力(第2章と第4章)
IIS 4.0で開発をするコツ Webアプリケーション構築.
情報処理実習 第05回 Excelマクロ機能入門 操作マクロ入門.
PowerPoint による スライドの作成
情報処理 第8回.
2017/3/2 情報処理 第8回.
プレゼンテーションソフトを活用しよう PowerPoint 2007の使いかた.
Microsoft PowerPoint98 Netscape Communicator 4.06[ja]
Microsoft PowerPoint98 Netscape Communicator 4.06[ja]
コンピュータ プレゼンテーション.
パワーポイントの使い方 東京女子大学 情報処理センター 浅川伸一.
情報処理 第7回.
Android と iPhone (仮題) 情報社会とコンピュータ 第13回
Lync 会議 Lync 会議に参加する Lync 2013 クイック リファレンス Lync 会議のスケジュール
Lync 会議 Lync 会議に参加する Lync 会議をスケジュールする 会議のオプションを設定する
2017/3/7 情報処理 第8回.
ファイルやフォルダを検索する ①「スタート」→「検索」→「ファイルとフォルダ」とクリックする。
Microsoft Office クイックガイド ~Word 2013~
Win32APIとMFC H107102 古田雅基 H107048 佐藤一樹 H107126 山下洋平.
2007 Microsoft Office system クイックガイド
C#によるWindowsFormApplication入門
COMを応用してExcelをコントロール
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
講師 宮川 翼 (情報処理センター テックサポーター)
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
JavaServlet&JSP入門 01K0018 中村太一.
F5 を押すか、または [スライド ショー] > [最初から] をクリックして、コースを開始してください。
BlueBeanClientを用いた連携の概要
9 Microsoft Word(1).
Magicのサブフォーム上に ガントチャート表示を実現
F5 を押すか、または [スライド ショー] > [最初から] をクリックして、コースを開始してください。
Microsoft Office 2010 クイックガイド ~応用編~
Microsoft Office クイックガイド ~OneNote 2013~
Microsoft Office 2010 クイックガイド ~応用編~
3 Macintoshの基本操作(3) 3.1 エイリアス エイリアスを作る ファイルなどの分身となるファイル アイコンを選択
Microsoft Office 2010 クイックガイド ~OneNote編~
プログラミング演習3 第2回 GUIの復習.
Netscape Communicator Eudora Microsoft Word
情報処理基礎 2006年 6月 22日.
経営工学基礎演習a PowerPointの利用.
10 Microsoft Word(1) 10.1 Microsoft Word v.Xの概要 起動 終了
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Microsoft PowerPoint IT講習会 /5 (Wed) テックサポーター  佐藤 諒.
Excel 2002,2003基本14 テンプレートを作る.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
プログラミング演習3 第2回 GUIの復習.
Jakarta Struts (2) ソフトウェア特論 第11回.
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
Microsoft Office クイックガイド ~応用編~
COM コンポーネント・オブジェクト・モデル.
Netscape Communicator Eudora Microsoft Word
とっちゃん Microsoft MVP for Visual C++
とっちゃん Microsoft MVP for Visual C++
情報基礎演習I(プログラミング) 第11回 7月12日 水曜5限 江草由佳
Microsoft Office クイックガイド ~基本編~
表計算 Excel 演習 1.Excel を使ってみる.
Microsoft Office クイックガイド ~応用編~
Microsoft SharePoint Online の Web サイトを カスタマイズする方法
Microsoft Office 2010 クイックガイド ~応用編~
How To WPF アプリケーション Part3 By 中博俊.
Presentation transcript:

COMを応用してExcelをコントロール えムナウ (児玉宏之) http://mnow.jp/ http://mnow.wankuma.com/ http://blogs.wankuma.com/mnow/ http://www.ailight.jp/blog/mnow/

Excelを内部に表示するプログラムの作成 Excelに制約をつけていこう アジェンダ 基本をおさらいしてみる OLEとCOM COMのインターフェース Excelを内部に表示するプログラムの作成 Excelに制約をつけていこう

OLE (Object Linking and Embedding) OLEとCOM OLE (Object Linking and Embedding) アプリケーションソフト間でデータを転送・共有するための仕組み OLEサーバー アプリケーションの機能提供側 OLEコンテナ 機能を利用するほう OLEコントロール(ActiveXコントロール) OLEサーバーのみで小型でシンプルな機能、インターネットに対応することでActiveXコントロールに改名

COM(Component Object Model) OLEとCOM COM(Component Object Model) COMはOLE、OLEオートメーション、OCX、ActiveX、COM+、DCOMをカバーする包括的な用語 部品化されたプログラムを作成・利用するための基盤となる技術 データのやりとりができるプログラム部品のことがCOMコンポーネント、ネットワークを通じて別のコンピュータ上にあるCOMコンポーネントを利用する技術がDCOM Windowsだけでなく、UNIXやMac OSにも移植

Microsoft Windows SDK 付属の OLE-COM Object Viewer で見てみる。 Excelの実行ファイルはCOMです。 Microsoft Windows SDK 付属の OLE-COM Object Viewer で見てみる。 Microsoft Excel Application IConnectionPointContainer IDispatch ISupportErrorInfo IUnknown

Release不足によりCOMが使っていないのに残ってしまう問題が発生する。 IUnkown QueryInterface インターフェイス識別子で識別されるインターフェイス ポインタを返す AddRef インターフェイスの参照カウントをインクリメントする。 Release インターフェイスの参照カウントをデクリメントする。 Release不足によりCOMが使っていないのに残ってしまう問題が発生する。

IDispatch IUnkownの構成要素QueryInterface/AddRef/ Releaseに以下のものが追加される。 COMのインターフェース IDispatch IUnkownの構成要素QueryInterface/AddRef/ Releaseに以下のものが追加される。 GetTypeInfo/GetTypeInfoCount オブジェクトの型情報を取得/オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得 GetIDsOfNames 名前(文字列)からDISPIDを取得 Invoke DISPIDや引数を使いプロパティおよびメソッドにアクセス

IConnectionPointContainer COMのインターフェース IConnectionPointContainer アプリケーションが外に出す関数(例えばイベント)を一覧や検索できる 見つかったConnectionPointに対してIDispatchを接続すれば、関数の呼び出し(イベント発生)時にIDispatchのInvokeメソッドが呼ばれる

Excelを内部に表示するプログラムの作成 ExcelはOLEサーバーとしてもOLEコンテナとしても動作する プロジェクトをOLEコンテナとして作成すればExcelをOLEサーバー(OLEオートメーションとも言う)として内部に表示することができる

Excelを内部に表示するプログラムの作成 MFC アプリケーションを作成する シングル ドキュメント プロジェクト形式: MFC 標準 視覚スタイルと色:規定 複合ドキュメント サポート:コンテナ データ ベースサポート:なし コマンド バー:クラシック メニューを使用する 高度な機能:コモン コントロール マニフェスト

Excelを内部に表示するプログラムの作成 出来上がったファイル stdafx CxxApp CWinAppを継承 CMainFrame CFrameWndを継承 CxxDoc COleDocumentを継承 CxxView CViewを継承 CntrItem COleDocObjectItemを継承

Excelを内部に表示するプログラムの作成 CxxDoc::OnNewDocument CString filepath("C:\\Users\\Public\\Documents\\ Demo\\OleDemo\\ExTest\\Text.xlsx"); m_pItem = new CxxCntrItem(this); m_pItem->CreateFromFile(filepath);

Excelを内部に表示するプログラムの作成 既存のドキュメントをView内部に表示 CxxView::OnInitialUpdate COleDocument* pDoc = (COleDocument*) GetDocument(); if (pDoc != NULL) { POSITION posItem = pDoc->GetStartPosition(); if (posItem != NULL) { CDocItem* pItem = pDoc->GetNextItem(posItem); COleDocObjectItem *pDocObjectItem = DYNAMIC_DOWNCAST(COleDocObjectItem, pItem); if (pDocObjectItem != NULL) { pDocObjectItem->DoVerb(OLEIVERB_SHOW, this); } m_pSelection = DYNAMIC_DOWNCAST(CExTestCntrItem, pItem); pDoc->UpdateAllViews(NULL);

Excelを内部に表示するプログラムの作成 COleClientItem::CreateFromFile ファイルを使って埋め込みアイテムを作成 COleClientItem::DoVerb サーバー アプリケーションが起動され、OLE アイテムが編集できるようになる OLEIVERB_SHOW :可能ならView内で開く OLEIVERB_OPEN:別Windowで開く

Excelを内部に表示するプログラムの作成 #import "C:\\Program Files\\Common Files\\Microsoft Shared\\Office12\\MSO.DLL“ rename("DocumentProperties", "DocumentPropertiesXL") rename("RGB", "MSO_RBGXL") #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\Vbe6ext.olb" #import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" rename("ReplaceText", "ReplaceTextXL") rename("CopyFile", "CopyFileXL") rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("Font", "FontXL") rename("Picture", "PictureXL") exclude("IFont") exclude("IPicture") no_dual_interfaces

Excelを内部に表示するプログラムの作成 ExcelVbaメソッド呼び出しと同じ形式で呼び出してくれる為の QueryInterface や Invoke を隠す実装とそのヘッダー mso.tlh mso.thi vbe6ext.tlh vbe6ext.thi excel.tlh excel.tli

Excelを内部に表示するプログラムの作成 COleClientItem::m_lpObject から LPOLELINK lpOleLink = NULL; m_lpObject->QueryInterface(IID_IOleLink, (LPVOID FAR*)&lpOleLink); lpUnk = NULL; if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR) { TRACE0("Warning: Link is not connected!\n"); lpOleLink->Release(); return NULL; } LPDISPATCH lpDispatch = NULL; lpUnk->QueryInterface(IID_IDispatch,(void**)&lpDispatch); _Workbook wb; wb.AttachDispatch(lpDispatch); _Application app; app = wb.GetApplication(); : lpDispatch->Release();

Excelを内部に表示するプログラムの作成 オブジェクトの意味やメソッドの意味がわからないとヘッダーだけではできない Excelヘッダーにはクラスやメソッドやパラメータの意味も使い方の例も載っていない Excelの開発用VisualBasicのHELPを参照してExcelヘッダーの使い方を推測することになる パラメータの使わない部分は省略値として vtMissing を利用する

Excelを内部に表示するプログラムの作成 excel.tlh Excelの開発タブからVisualBasicを表示してHelpを出すと開発者用リファレンスが表示される HelpのExcel 2007 開発者用リファレンスーリファレンスに excel.tlh に記述されているオブジェクトが一覧で表示される 参照したいオブジェクトをクリックしてさらにメンバーを確認すればメソッドやプロパティやイベントが確認できる

Excelを内部に表示するプログラムの作成 mso.tlh Excelの開発タブからVisualBasicを表示してHelpを出すと開発者用リファレンスが表示される HelpのExcel 2007 開発者用リファレンスー2007 Microsoft Office system オブジェクト ライブラリ リファレンスーリファレンスに mso.tlh に記述されているオブジェクトが一覧で表示される 参照したいオブジェクトをクリックしてさらにメンバーを確認すればメソッドやプロパティやイベントが確認できる

Excelに制約をつけていこう メニューを非表示にする OLEサーバー(Excel)のメニューをOLEコンテナ(作成プロジェクト)に挿入変更削除する呼び出しを無処理にするとExcelメニューが出ない COleClientItem::OnInsertMenus COleClientItem::OnSetMenu COleClientItem::OnRemoveMenus

Excelに制約をつけていこう ツールバーを非表示にする すべて非表示にするなら _Application から Toolbars を取得して配列の1から個数分 Toolbar を取得し Visible プロパティを VARIANT_FALSE に設定する Toolbar の Name プロパティを確認すればひとつのツールバーについて非表示にできる

入力できる文字を制限する 例えば特定のコントロールキーを無効にしたい場合など Excelに制約をつけていこう 入力できる文字を制限する 例えば特定のコントロールキーを無効にしたい場合など user32.dll の SetWindowsHookEx 関数を WH_KEYBOARD と WindowHandle と フックルーチンのアドレス をパラメータとしてフックすればExcelでキー入力があったときにフックルーチンがコールされる WH_KEYBOARD_LL は全てのプロセスのキー入力がフックできる

マウスクリックを制限する 右クリックでコンテキストメニューが表示されることを防止する Excelに制約をつけていこう マウスクリックを制限する 右クリックでコンテキストメニューが表示されることを防止する user32.dll の SetWindowsHookEx 関数を WH_MOUSE と WindowHandle と フックルーチンのアドレス をパラメータとしてフックすればExcelでマウス操作があったときにフックルーチンがコールされる WH_MOUSE _LL は全てのプロセスのマウス操作がフックできる

user32.dll の SetWindowsHookEx 関数は注意して使用しないとOSの誤動作につながるので注意深く実装する必要がある Excelに制約をつけていこう user32.dll の SetWindowsHookEx 関数は注意して使用しないとOSの誤動作につながるので注意深く実装する必要がある ウィルス監視をするプログラムが user32.dll の SetWindowsHookEx 関数を監視して警告を発生する場合があるので注意が必要

Excelのイベントを拾う Excelに制約をつけていこう Excelのイベントで保存・印刷・右クリックなどを抑止できる IConnectionPointContainer を利用して Excel の Application とイベントを拾うクラスを結ぶ Excel のイベントが入るとイベントを拾うクラスの Invoke が呼ばれるので DISPID を識別してイベントハンドラを書く 終了時には IConnectionPointContainer で結んだのを解除する

Excelに制約をつけていこう Excel のイベントを拾うクラス IDispatch を継承して QueryInterface / AddRef / Release / Invoke を実装する QueryInterface は IID_IDispatch / IID_Iunknown / IID_IExcelEventSink で自分を返す Invoke はイベントハンドラ GetTypeInfo / GetTypeInfoCount / GetIDsOfNames は E_NOTIMPL を返して未実装にする

Excel の Application とイベントを拾うクラスを結ぶ IConnectionPointContainer *pConnPtContainer; app.QueryInterface(IID_IConnectionPointContainer, (void **)&pConnPtContainer); pConnPtContainer->FindConnectionPoint(IID_IExcelEventSink, &pConnectionPoint); pConnectionPoint->Advise(this, &adviseCookie); pConnPtContainer->Release();

DISPID を識別してイベントハンドラを書く Excelに制約をつけていこう DISPID を識別してイベントハンドラを書く HRESULT _stdcall ExcelEventSink::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) {     if (dispIdMember == 0x624) // WorkbookBeforePrint     { Excel::_WorkbookPtr pWorkbook = pDispParams->rgvarg[0].pdispVal; if (m_pWorkbook != NULL)     if (m_pWorkbook == pWorkbook) VARIANT_BOOL * Cancel = pDispParams->rgvarg[1].pboolVal; *Cancel = VARIANT_TRUE;     } }     return S_OK;

COMやOLEを使ってVisualBasicで操作する以上のことができるのを理解してもらえただろうか Excelに制約をつけていこう 以下のように順を追って制限をした メニューを非表示にする ツールバーを非表示にする 入力できる文字を制限する マウスクリックを制限する Excelのイベントを拾って操作をキャンセルする COMやOLEを使ってVisualBasicで操作する以上のことができるのを理解してもらえただろうか

Excel を題材にして OLEとCOM の深遠なる世界の一端を見てきました まとめ Excel を題材にして OLEとCOM の深遠なる世界の一端を見てきました 今回はなるべくラッパーの少ない道を通ってきましたが最小限のラッパー(Excelヘッダー)は使っています VisualBasicやC#でExcelをコントロールする方は今後もいると思いますがこんな世界が基礎としてあることを理解していてほしいと思います。