環境:
VC++2005 Pro.
Excel2003
Windows Xp Pro.
MFCを使ったWindowsプログラムでExcelを自動化する方法についてお尋ねします。
http://support.microsoft.com/kb/307473/
このページに書かれている手順のとおり、Typelibクラス追加ウィザードによって、
_ApplicationインターフェースのMFCラッパクラスをプロジェクトに追加しました。
追加されたファイル名はCApplicationl.hです。
次に、ダイアログボックスクラスのファイルにこのCApplication.hをインクルードし
ました。
// AutoProjectDlg.cpp
#include stdafx.h
#include CApplication.h
この状態でビルドしたところ、エラーが大量に発生して失敗しました(エラーメッセー
ジの一部は末尾に添付)。
エラーの発生場所はすべてexcel.tlh内です。
前記ウェブページのタイトルは「VisualC++.NETから~」となっていますが、次のページ
でもこれを参照するように指示されていますので、VC2005でもこの手順で良いと理解し
ました。
「MFC および Visual C++ 2005 または Visual C++ .NET で Excel を自動化して~」
http://support.microsoft.com/kb/308407/ja
これらのページに書かれていること以外で、MFCラッパクラスを作成、使用するうえで必
要な手順があるのでしょうか?
あるいは、Typelibクラス追加ウィザードによって追加したMFCクラスにはなにか修正す
べきところがあるのでしょうか?
以上、よろしくお願いいたします。
-----
# エラーの総数は200個以上あるので、最初の一部のみ添付します。
エラー 13 error C2371: 'FontPtr' : 再定義されています。異なる基本型で
す。 d:\cpp\081218excel\autoproject\debug\excel.tlh 1219
エラー 14 error C2786: 'BOOL (__stdcall *)(HDC,int,int,int,int)' :
__uuidof の無効なオペランドです。
d:\cpp\081218excel\autoproject\debug\excel.tlh 1297
エラー 15 error C2923: '_com_IIID' : 'Rectangle' は、有効な テンプレー
ト 型引数 (パラメータ '_Interface') ではありません。
d:\cpp\081218excel\autoproject\debug\excel.tlh 1297
エラー 16 error C3203: '_com_IIID' : 非特殊クラス テンプレート は、テン
プレート 引数として テンプレート パラメータ '_IIID' に使用できません。実際の型
を指定してください d:\cpp\081218excel\autoproject\debug\excel.tlh 1297
(以下略)
>あるいは、Typelibクラス追加ウィザードによって追加したMFCクラスにはなにか修正す
>べきところがあるのでしょうか?
ウィザードで作成されたMFCクラスに#importで始まる文があれば削除してみてください。
(生成されたtlh、tliも削除して構いません)
sakura様、ご回答ありがとうございました。
> ウィザードで作成されたMFCクラスに#importで始まる文があれば削除してみてくださ
い。
> (生成されたtlh、tliも削除して構いません)
ウィザードが作成したCApplication.hに#import文がありました。
#import文を削除後、ビルドに成功しました。
Excelを起動するサンプルコードも実行できました。
なぜ#import文が要らないのか、要らないものならばなぜWizardが書いてしまうのかとい
う疑問は残りますが、それについてはおいおい調べたいと思います。
----------
次に、
「MFC および Visual C++ 2005 または Visual C++ .NETでExcelを自動化して~」
http://support.microsoft.com/kb/308407/ja
で説明されているサンプルを試すため、
_Workbook
_Worksheet
Workbooks
Worksheets
Range
インターフェースのMFCラッパクラスをTypelibクラス追加ウィザードで作成しました。
追加されたヘッダファイルは次の5つです。
CWorkbook.h
CWorksheet.h
CWorkbooks.h
CWorksheets.h
CRange.h
これらのファイルからも#import文を削除したうえで、ダイアログボックスクラスのヘッ
ダファイルの#pragma onceディレクトリ直後で#includeしてからビルドしたところ、ま
たエラーが大量発生しました。
これらのヘッダのうちどれが問題かを調べたところ、エラーが発生するのは
CWorkbooks.h
CWorksheets.h
CRange.h
のいずれかひとつ以上をインクルードしたときでした。
例えば、CWorkbooks.hをインクルードしたときのエラーメッセージを見ると、
Application
XLCreator
Parameter
RHS
といった識別子が定義されていないとおこられています。
確かにこれらを定義したヘッダなどはプロジェクト内にないので、当たり前ではありま
す。
インクルードすべきヘッダファイルがあるのではないかとアタリをつけてMSDN等も調べ
ているところですが、現時点で判明していません。
たびたび申し訳ありませんが、ご存じでしたらご教示ください。
誤記:sakura様
訂正:subaru様
失礼しました。
正しい対処方法は知りませんがとりあえず動かすなら
・定義されてない型をLPDISPATCHに変更する
・enumの定義をOLEViewerか生成されたtlhの中から定義を探して持ってくる
くらいしか思いつきません。
subaru様、ご回答ありがとうございます。
エラーが発生していた
CWorkbooks.h
CWorksheets.h
CRange.h
の3ファイルについて、
Application --> LPDISPATCH
XLCreator --> long ※ CApplication.hファイルを参考にした。
Font --> LPDISPATCH
と変更した後、ビルドに成功しました。
しかし、
「MFC および Visual C++ 2005 または Visual C++ .NETでExcelを自動化して~」
http://support.microsoft.com/kb/308407/ja
にあるサンプルコードを記述してからコンパイルしたところまたエラーが...orz
エラーの原因は、サンプルコードではウィザードが作成したクラスにはないメンバ関数
を使っていたり、引数の個数が異なっていたりとさまざまです。
サンプルコードの間違いかとも思いましたが、例えばCWorkbookクラスには当然あるだろ
うと思ったget_WorkSheets関数(あるいはそれに相当する関数)が見あたらない、とい
った具合に、Wizardが作成したクラスにも怪しいところが多々あります。
MFCラッパクラスがWizardで簡単に作れるのなら開発効率が良いと思って試していたので
すが大いに期待がはずれてしまいました。
これ以上の調査をしている時間がなくなってしまったので、今回はMFCラッパクラスはあ
きらめて、#importしたインターフェースをナマで使うか、VBに流れるかします。
解決しませんでしたがこのスレッドは閉じます。
おつきあいくださりありがとうございました。
> subaru様、皆様