ファイルモニカ前節では、CLSIDをベースにオブジェクトを取得するためにクラスモニカを取り上げました。今回は、ファイルパスをベースにオブジェクトを取得するファイルモニカを取り上げます。ファイルモニカを作成するにはCreateFileMonikerを呼び出します。*ppmk);lpszPathNameは、ファイルパスを指定します。ppmkは、ファイルモニカを受け取る変数のアドレスを指定します。これは具体的にはどのような仕組みで行われているのでしょうか。ファイルからオブジェクトのCLSIDを取得します。CLSIDを格納していないファイルについてはここで失敗することになります。そのオブジェクトをIPersistFileで表すようにします。IPersistFile::Loadにファイルパスを指定すれば、オブジェクトはそのファイルをロードすることになります。WordならばDocumentオブジェクト、ExcelならばWorkbookオブジェクトになるようです。これらのオブジェクトは、IPersistFileの他にIOleItemContainerやIOleObject、IOleDocumentなどを実装しています。指定したファイルが既に開かれている場合、ファイルモニカのBindToObjectは処理の時間が短くなる可能性があります。BindToObjectはファイルに対してGetClassFileを呼び出す前に、ROTからオブジェクトを取得しようとするからです。既存のオブジェクトを返そうとするわけです。オブジェクトがROTに登録されていない場合は、BindToObject内部でオブジェクトが作成されることになります。今回のプログラムは、Excelのファイルからデータを取得して表示します。TEXT("ファイルモニカの取得に失敗しました。TEXT("オブジェクトの取得に失敗しました。ファイルパスをMkParseDisplayNameに指定してもファイルモニカの作成は可能です。どちらを使用しても変化はないと思われますが、今回はCreateFileMonikerを呼び出しています。ファイルモニカを取得したらBindToObjectを呼び出して、関連するオブジェクトを取得することができます。そこからRangeオブジェクトを取得できます。GetRangeValueでそれを行っています。IDispatchを使用したOfficeアプリケーションの操作は、オートメーションの章で取り上げています。目的のオブジェクトを取得するために必要な作業が、モニカの使用によって簡略化されているかどうかは確認しておかなければなりません。この流れは今回のコードよりも複雑であると考えられます。よって、今回の場合はファイルモニカを使用した方が効率的であると言えます。バインドの簡略化これまで述べてきたように、モニカを通じて目的のオブジェクトを取得するためには主に3つの作業が必要です。最後にオブジェクトへのバインドという具合になります。バインドコンテキストの作成とバインドを同時に行えるようになります。IID_PPV_ARGS(&pWorkbook));モニカを作成していれば、BindMonikerを呼び出すことができます。BindMonikerは内部でCreateBindCtxとIMoniker::BindToObjectを呼び出します。次に示すCoGetObjectを呼び出せば、モニカの作成自体もアプリケーションから隠蔽することができます。IID_PPV_ARGS(&pWorkbook));第1引数には、CreateFileMonikerやMkParseDisplayNameに指定する文字列を指定します。第2引数はBIND_OPTS構造体を指定することができますが、NULLで問題ありません。