MFC VC++6.0 XP
.docの文書を読み込んで表示したいのですが、「種類が一致しません」というエラーウ
ィンドウがでてしまいます。一日中やってたのですが、うごきませんでした。
つかっているのが、VC++6.0なので、msword.olbしか読めません。
void CTestDispWordDlg::OnButton1()
{
char lpszFileName[] = _T(abc.doc);
_Application MyWord;
MyWord.CreateDispatch(Word.Application); // 接続
// MyWord.m_bAutoRelease = TRUE;
MyWord.SetVisible(TRUE); // アプリケーションを不可視に
Documents m_documents(MyWord.GetDocuments());
m_documents.Open(
&_variant_t(lpszFileName),//&Object^ FileName,
&_variant_t(false),//&Object^ ConfirmConversions::
when 'word' false,else true ;
&_variant_t(true),//&Object^ ReadOnly,
&_variant_t(false),//&Object^ AddToRecentFiles,
&_variant_t("),//&Object^ PasswordDocument,
&_variant_t("),//&Object^ PasswordTemplate,
&_variant_t(false),//&Object^ Revert,
&_variant_t("),//&Object^ WritePasswordDocument,
&_variant_t("),//&Object^ WritePasswordTemplate,
// &_variant_t(wdOpenFormatText),//&Object^ Format,
&_variant_t((long)0),//&Object^ Format,
&_variant_t(false),//&Object^ Encoding,
&_variant_t(true),//&Object^ Visible,
&_variant_t(temp),//&Object^ OpenAndRepair,
&_variant_t((long)0),//&Object^ DocumentDirection,
&_variant_t(false),//&Object^ NoEncodingDialog,
&_variant_t(false)//&Object^ XMLTransform
) ;
}
OLEって、オフィースのバージョンによってクラス名まで違うのですね。
たいへん、なんで、こんなになってるんだろう?
COMの仕組み上、既にリリースされているインターフェイスに
追加機能を入れたインターフェイスを公開する場合、インターフェイス名を
変えないといけなかったような気がしますけれど、あってるかなぁ?
以前のインターフェイスを使っているアプリが以前のインターフェイス名で
アクセスした時は以前の機能が動作し、新しいインターフェイス名で
アクセスした時は新しい機能が動作する為だったと思います。
そうする事で古い機能と新しい機能を同居させると言う話だったかと。
この辺の考え方もCOMの仕組みに関わりがあったと思いますよ。
遅延でバインドさせるときとかは名称で呼び出しますから,同じ名称は識別できませんね
古いのも使いたいし新しいのも使いたい時はルールはわかりませんけど,名前は変わる必
要があると思いますよ
でも,追加機能が増えたとき名前が変わって,古いのがなくなってしまうのは気まずい感
じがしますね
デバイスが提供してるものが追加機能がついて,バージョンも大きく変わっても,名前さ
え変わっていなければ,古いソフトは構わず動作できますからね
ルールはわかりませんけど・・・
PATIO さん、hiroccoさん、レスありがとうございます。
例をあげるとApplicationと_Applicationがあってメンバ関数もそれぞれ違うみたいなん
ですが、よくわかりません。
タイプライブラリの各クラス、各メソッドについて、機能、パラメータなどの説明がな
いのが、つらいですね。
手あたり次第にあれこれ読んでみましたが、IvokeHelperのパラメータについては、サー
バ側(この場合、Microsoft word)にありそうなんですが、みつけられません。
ん・・・なんとも、手詰まり感がでてきました。
ちょっと質問は、分岐しちゃいますが、OLEをつかって、ワードの.docファイルやエ
クセルの.xlsなどを出力ファイルとする帳票プログラムみたいなものはできますか?
記憶は薄いですけどApplicationの方ですよ
ちがったかな?
あとはOfficeのVBAの操作と同じですね
Officeでできる事はたぶん全部できますよ
hiroccoさん、レスありがとうございます。
こういうページを見つけて、お勉強してるんですが、
http://www.ujasiri.com/prglib/vc/excel/import/xls_imp_coapp_exp.html
#import C:\Program Files\Common Files\Microsoft Shared\Office11\MSO.DLL
no_namespace rename(DocumentProperties, DocumentPropertiesXL)
と記述している行で
fatal error C1083: インクルード ファイルがオープンできません。\MSO.tlh': Permission denied
というエラーがでてしまいます。
オフィースのOLEを扱うのには、なにか、オフィース、VC++以外に買わないとい
けないのでしょうか?
ちなにみ、わたしの環境は、excel 2003 は、プレインストール、VC++ 6.0
は、大学時代にアカデミックバージョンを買いました。
出来るか出来ないかで言うと、
VC6.0 + Excel2000/2003 の組み合わせだけで
.xls を開いたり作成したりするソフトを作ったことはありますよ。
5 年以上前なのでもう覚えてませんが。
たしか OLE を使ったExcel の汎用操作管理クラスを作って、
帳票として Excel ファイルを出力してました。
少ないネット上の記事と、VBA の関数名を頼りに手探りでやってた記憶があります。
具体的なアドバイスが出来ないので役立たずで申し訳ないです。
紅' さん、レスありがとうございます。
たいへん、貴重なご意見ありがとうございます。
エクセルを使うユーザなら、VC++で操作できれば、助かるはずですよね。
マニュアルがないというのは、マイクロソフトは、このあたりを公開してないというこ
とになるのかな?とおもいます。
> http://www.ujasiri.com/prglib/vc/excel/import/xls_imp_coapp_exp.html
のページに
word操作編があります。
http://www.ujasiri.com/
http://www.ujasiri.com/prglib/vc/word/vc_word.html
こちらも参照されてみてはいかがでしょう。
ぺろさん、ryoさん、ありがとうございます。
なかなかバージョンが違うと、動かないのが不思議で、でもエクセルのほうは、なんと
かうごきましたが、Range::SetValue()という関数をRange::SetValue2()に変えなければ
いけませんでした。
それで、やはりマイクロソフトが出している、機能説明というものがなければ、トライ
&エラーの領域を超えることができないので、バグが心配だなぁ・・
とおもっています。
で、ryoさんに載せていただいた、そのマイクロソフトの機能説明ですね。
ありがとうございます。(バージョンが最新なので機能するかどうか、わかりません
が、)今から、読んでみます。
お二人とも非常にたすかりました。ありがとうございました。
PS’)2003の場合、excel関係のタイプライブラリは、Excel.exeに埋め込まれている
ということもわかりました
ryoさんが載せていただいたページをあれこれ読みました。
2003のバージョンもありました。ワード版もありました。
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word
(v=office.11).aspx(ワード版)
でも、書いてる内容が乏しくって、これでプログラムを組めっていうのは、無理なよう
に思います。
Office2003の場合、インストールするときにVBAのヘルプもインストールしていれば
VBAWD10.CHMというファイルがOfficeディレクトリのどこかにあるはずです。
VBAで説明されていますが、プロパティやメソッドの内容は一通りわかるので
VC++でも参考になると思います。