お世話になっております。
WinXp Pro SP1 VC6 SP6 MFC(exe)で
OLEオートメーションを使ってMS-Wordの
文書を作成するプログラムを作成しています。
WordはMS-Office2000 Premium の中のWord2000です。
そのために、クラスウィザードを使って
Wordのタイプライブラリから
Wordのディスパッチ関数にアクセスするための
関数群をメンバに持つクラスを作成し、
そのメンバ関数に
下のように宣言、定義されているものがあり、
それを呼び出そうとしているのですが、
//クラスウィザードによって作成された関数
class Documents : public COleDispatchDriver
{
・・・省略
LPDISPATCH Add(VARIANT* Template, VARIANT* NewTemplate,
VARIANT* DocumentType, VARIANT* Visible);
・・・省略
};
LPDISPATCH Documents::Add(VARIANT* Template, VARIANT* NewTemplate, VARIANT*
DocumentType, VARIANT* Visible)
{
LPDISPATCH result;
static BYTE parms[] =
VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT;
InvokeHelper(0xe, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms,
Template, NewTemplate, DocumentType, Visible);
return result;
}
//呼び出し側
void CWordControlApp::OnMakeDocument()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CString strFileName = _T(C:\\Project\\Document\\TheWorld.doc);
_Application MyWord;
MyWord.CreateDispatch(Word.Application);
MyWord.m_bAutoRelease = TRUE;
MyWord.SetVisible();
VARIANT val[4];
memset(val, 0, sizeof(VARIANT) * 4);
val[0].lVal = wdNormalTemplate; //0
val[1].lVal = wdNormalTemplate; //0
val[2].lVal = wdTypeDocument; //0
val[3].boolVal = TRUE;
Documents m_documents(MyWord.GetDocuments());
//↓ここで呼び出し
LPDISPATCH pDispatch = m_documents.Add(&val[0], &val[1], &val[2], &val[3]);
_Document m_doc(pDispatch);
・・・以下省略
}
上記Addを呼び出すと変数の種類が違います
というメッセージが出てしまいます。
ということはやはりVARIANT変数の
設定が違うのだと思うのですが、
どういう設定の仕方が正しいのでしょうか。
ご存知の方がいらっしゃいましたらご教授ください。
また、Wordとの連携技術などの参考にできる
サイトをご存知でしたらそのURLを教えて
いただけないでしょうか。
長くなって申し訳ありません。
以上、よろしくお願いいたします。
vtメンバにどの型の値をセットしたのか指定してやる必要があります。
VARIANT v;
v.vt = VT_I4;
v.lVal = 5;
返事が送れて申し訳ございません。
dairygoods さんのおっしゃるとおり、
VARIANTオブジェクトに設定した値の型を
vtに設定してやることで
正しく認識されました。
ありがとうございました。
あともうひとつ、Word連携の
ほうなのですが、ここの過去ログで
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200204/02040072.txt
というのを見つけました。その中で_Documentクラスに
void SaveAs(LPCTSTR FileName, WdSaveFormat FileFormat,
BOOL LockComments, LPCTSTR Password,
BOOL AddToRecentFiles, LPCTSTR WritePassword,
BOOL ReadOnlyRecommended, BOOL EmbedTrueTypeFonts,
BOOL SaveNativePictureFormat, BOOL SaveFormsData,
BOOL SaveAsAOCELetter);
という関数を作っています。これはWordのタイプライブラリから作られる
void SaveAs(VARIANT* FileName, VARIANT* FileFormat,
VARIANT* LockComments, VARIANT* Password,
VARIANT* AddToRecentFiles, VARIANT* WritePassword,
VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts,
VARIANT* SaveNativePictureFormat, VARIANT* SaveFormsData,
VARIANT* SaveAsAOCELetter);
のオーバーロード関数なのですが、そのオーバーロード関数の引数の型
たとえば、LockCommentsがBOOLでWritePasswordがLPCTSTRで・・・
といった情報はどうやって得たのでしょうか?
ご存知の方がいらっしゃいましたらどうぞご教授ください。
よろしくお願いいたします。