一个开源的OFFICE AUTOMATION小实例


本实例是采用IDispatch接口来实现,源代码来自:http://www.codeproject.com/Articles/34998/MS-Office-OLE-Automation-Using-C,对于理解AUTOMATION有帮助

MSWord.h

#pragma once

class CMSWord
{
protected:
	IDispatch*	m_pWApp;
	IDispatch*  m_pDocuments;
	IDispatch*	m_pActiveDocument;
	HRESULT		m_hr;
	HRESULT Initialize(bool bVisible=true);
public:
	CMSWord();
	~CMSWord();
	HRESULT SetVisible(bool bVisible=true);
	HRESULT Quit();
	HRESULT OpenDocument(LPCTSTR szFilename, bool bVisible=true);
	HRESULT NewDocument(bool bVisible=true);
	HRESULT CloseActiveDocument(bool bSave=true);
	HRESULT CloseDocuments(bool bSave=true);
	HRESULT SetSelectionText(LPCTSTR szText);
	HRESULT InserPicture(LPCTSTR szFilename);
	HRESULT AddComment(LPCTSTR szComment);
	HRESULT MoveCursor(int nDirection=2,bool bSelection=false);
	HRESULT DeleteChar(bool bBack=false);
	HRESULT CheckSpelling(LPCTSTR szWord, bool &bResult);
	HRESULT CheckGrammer(LPCTSTR szString, bool &bResult);
	HRESULT SetFont(LPCTSTR szFontName, int nSize, bool bBold, bool bItalic,COLORREF crColor);
};

MSWord.cpp

#include "stdafx.h"
#include "MSWord.h"
#include "OLEMethod.h"

CMSWord::CMSWord()
{
	m_pWApp=NULL;
	m_pDocuments=NULL;
	m_pActiveDocument=NULL;
}

HRESULT CMSWord::Initialize(bool bVisible)
{
	CoInitialize(NULL);
	CLSID clsid;
	m_hr = CLSIDFromProgID(L"Word.Application", &clsid);
	if(SUCCEEDED(m_hr))
	{
		m_hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&m_pWApp);
		if(FAILED(m_hr)) m_pWApp=NULL;
	}
	{
		m_hr=SetVisible(bVisible);
	}
	return m_hr;
}



HRESULT CMSWord::SetVisible(bool bVisible)
{
/*	DISPID dispID;
	VARIANT pvResult;
	LPOLESTR ptName=_T("Visible");
	m_hr = m_pWApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
	if(SUCCEEDED(m_hr))
	{
		VARIANT x;
		x.vt = VT_I4;
		x.lVal =bVisible?1:0;
		DISPID prop=DISPATCH_PROPERTYPUT;

		DISPPARAMS dp = { NULL,NULL,0,0 };
		dp.cArgs =1;
		dp.rgvarg =&x;
		dp.cNamedArgs=1;
		dp.rgdispidNamedArgs= ∝
		m_hr = m_pWApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, 
								&dp, &pvResult, NULL, NULL);
	}*/
	VARIANT x;
	x.vt = VT_I4;
	x.lVal = bVisible;
	m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, m_pWApp, L"Visible", 1, x);

	return m_hr;
}

HRESULT CMSWord::OpenDocument(LPCTSTR szFilename, bool bVisible)
{
	if(m_pWApp==NULL) 
	{
		if(FAILED(m_hr=Initialize(bVisible)))
			return m_hr;
	}
	COleVariant vFname(szFilename);
	VARIANT fname=vFname.Detach();
	// GetDocuments
	{
		VARIANT result;
		VariantInit(&result);
		m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pWApp, L"Documents", 0);
		m_pDocuments= result.pdispVal;
	}
	// OpenDocument
	{
		VARIANT result;
        VariantInit(&result);
		m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pDocuments, L"Open", 1, fname);
		m_pActiveDocument = result.pdispVal;
	}
	return m_hr;
}

HRESULT CMSWord::NewDocument(bool bVisible)
{
	if(m_pWApp==NULL) 
	{
		if(FAILED(m_hr=Initialize(bVisible)))
			return m_hr;
	}

	{
		VARIANT result;
		VariantInit(&result);
		m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pWApp, L"Documents", 0);
		m_pDocuments = result.pdispVal;
	}	

	{
		VARIANT result;
		VariantInit(&result);
		m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pDocuments, L"Add", 0);
		m_pActiveDocument = result.pdispVal;
	}
	return m_hr;
}

// bSave=true will autosave the document. bSave=false will close document without saving.
HRESULT CMSWord::CloseDocuments(bool bSave)
{
	if(m_pWApp==NULL) return E_FAIL;
	{
		VARIANT result;
        VariantInit(&result);
		COleVariant varSave;
		varSave.boolVal=bSave;
		m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pDocuments, L"Close", 1, varSave.Detach());
		m_pDocuments=NULL;
		m_pActiveDocument=NULL;
	}	 
	return m_hr;
}

HRESULT CMSWord::DeleteChar(bool bBack)
{

	if(m_pWApp==NULL) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	IDispatch *pSelection;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
		pSelection=result.pdispVal;
	}

	{
		VARIANT wdCharacter, Count;
		wdCharacter.vt =VT_I4;
		wdCharacter.lVal =1;
		Count.vt =VT_I4;
		Count.lVal =1;
		if(bBack)
			OLEMethod(DISPATCH_METHOD, NULL, pSelection, L"TypeBackspace", 0);
		else
			OLEMethod(DISPATCH_METHOD, NULL, pSelection, L"Delete", 2,Count,wdCharacter);
	}
	return m_hr;
}

HRESULT CMSWord::CheckSpelling(LPCTSTR szWord, bool &bResult)
{
	if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	{
		VARIANT result;
		VariantInit(&result);
		COleVariant varWord(szWord);
		OLEMethod(DISPATCH_METHOD, &result,pDocApp,L"CheckSpelling",1,varWord.Detach());
		bResult=result.boolVal;
	}
	return m_hr;
}

HRESULT CMSWord::CheckGrammer(LPCTSTR szString, bool &bResult)
{
	if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	{
		VARIANT result;
		VariantInit(&result);
		COleVariant varString(szString);
		OLEMethod(DISPATCH_METHOD, &result,pDocApp,L"CheckGrammar",1,varString.Detach());
		bResult=result.boolVal;
	}
	return m_hr;
}

HRESULT CMSWord::InserPicture(LPCTSTR szFilename)
{
	if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	IDispatch *pSelection;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
		pSelection=result.pdispVal;
	}
	IDispatch *pInlineShapes;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"InlineShapes", 0);
		pInlineShapes=result.pdispVal;
	}
	{
		COleVariant varFile(szFilename);
		COleVariant varLink((BYTE)0);
		COleVariant varSave((BYTE)1);
		OLEMethod(DISPATCH_METHOD,NULL,pInlineShapes,L"AddPicture",3,varSave.Detach(),varLink.Detach(),varFile.Detach());
	}
	return m_hr;
}

HRESULT CMSWord::SetFont(LPCTSTR szFontName, int nSize, bool bBold, bool bItalic,COLORREF crColor)
{
	if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	IDispatch *pSelection;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
		pSelection=result.pdispVal;
	}
	IDispatch *pFont;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"Font", 0);
		pFont=result.pdispVal;
	}
	{
		COleVariant oleName(szFontName);
		m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Name", 1, oleName.Detach());
		VARIANT x;
		x.vt = VT_I4;
		x.lVal = nSize;
		m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Size", 1, x);
		x.lVal = crColor;
		m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Color", 1, x);
		x.lVal = bBold?1:0;
		m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Bold", 1, x);
		x.lVal = bItalic?1:0;
		m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Italic", 1, x);
	}
	pFont->Release();
	pSelection->Release();
	pDocApp->Release();
	return m_hr;
}

HRESULT CMSWord::MoveCursor(int nDirection,bool bSelection)
{
	if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	IDispatch *pSelection;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
		pSelection=result.pdispVal;
	}

	{
		VARIANT wdCharacter, wdExtend,Count;
		wdCharacter.vt =VT_I4;
		wdCharacter.lVal =1;
		wdExtend.vt =VT_I4;
		wdExtend.lVal =bSelection?1:0;
		Count.vt =VT_I4;
		Count.lVal =1;
		switch(nDirection)
		{
			case 1:
				OLEMethod(DISPATCH_METHOD, NULL, pSelection, L"MoveLeft", 3,wdExtend,Count,wdCharacter);
				break;
			case 2:
				OLEMethod(DISPATCH_METHOD, NULL, pSelection, L"MoveRight", 3,wdExtend,Count,wdCharacter);
				break;
			case 3:
				wdCharacter.lVal =5;
				OLEMethod(DISPATCH_METHOD, NULL, pSelection, L"MoveUp", 3,wdExtend,Count,wdCharacter);
				break;
			case 4:
				wdCharacter.lVal =5;
				OLEMethod(DISPATCH_METHOD, NULL, pSelection, L"MoveDown", 3,wdExtend,Count,wdCharacter);
				break;
		}
	}
	pDocApp->Release();
	pSelection->Release();
	return m_hr;
}

HRESULT CMSWord::AddComment(LPCTSTR szComment)
{
	if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	IDispatch *pSelection;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
		pSelection=result.pdispVal;
	}
	IDispatch *pRange;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"Range", 0);
		pRange = result.pdispVal;
	}
	IDispatch *pComments;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Comments", 0);
		pComments = result.pdispVal;
	}
	{
		COleVariant sCmt(szComment);
		VARIANT result;
        VariantInit(&result);
		VARIANT varRange;
		varRange.vt = VT_DISPATCH;
		varRange.pdispVal = pRange;
		OLEMethod(DISPATCH_METHOD, &result, pComments, L"Add", 2, sCmt.Detach(), varRange);
	}
	pRange->Release();
	pComments->Release();
	pDocApp->Release();
	pSelection->Release();
	return m_hr;
}

HRESULT CMSWord::SetSelectionText(LPCTSTR szText)
{
	if(m_pWApp==NULL) return E_FAIL;
	IDispatch *pDocApp;
	{  
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
		pDocApp= result.pdispVal;
	}
	IDispatch *pSelection;
	{
		VARIANT result;
		VariantInit(&result);
		OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
		pSelection=result.pdispVal;
	}

	{
		COleVariant sTxt(szText);
		VARIANT text=sTxt.Detach();
		OLEMethod(DISPATCH_METHOD, NULL, pSelection, L"TypeText", 1,text);

	}
	pDocApp->Release();
	pSelection->Release();
	return m_hr;
}

// bSave=true will autosave the document. bSave=false will close document without saving.
HRESULT CMSWord::CloseActiveDocument(bool bSave)
{
	if(m_pWApp==NULL) return E_FAIL;
	{
		VARIANT result;
        VariantInit(&result);
		COleVariant varSave;
		varSave.boolVal=bSave;
		m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pActiveDocument, L"Close", 1, varSave.Detach());
		m_pActiveDocument=NULL;
	}	 
	return m_hr;
}

HRESULT CMSWord::Quit()
{
	if(m_pWApp==NULL) return E_FAIL;
	DISPID dispID;
	LPOLESTR ptName=_T("Quit");
	m_hr = m_pWApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
	
	if(SUCCEEDED(m_hr))
	{
		DISPPARAMS dp = { NULL, NULL, 0, 0 };
		m_hr = m_pWApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, 
									&dp, NULL, NULL, NULL);
	}
	return m_hr;
}

CMSWord::~CMSWord()
{
	Quit();
	if(m_pWApp!=NULL) 
	{
		m_pWApp->Release();
		m_pWApp=NULL;
	}
	CoUninitialize();
}

OLEMethod.cpp
#include "stdafx.h"
#include "OLEMethod.h"


HRESULT OLEMethod(int nType, VARIANT *pvResult, IDispatch *pDisp,LPOLESTR ptName, int cArgs...)
{
    if(!pDisp) return E_FAIL;

    va_list marker;
    va_start(marker, cArgs);

    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    char szName[200];


    // Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

    // Get DISPID for name passed...
    HRESULT hr= pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
    if(FAILED(hr)) {
        return hr;
    }
    // Allocate memory for arguments...
    VARIANT *pArgs = new VARIANT[cArgs+1];
    // Extract arguments...
    for(int i=0; i<cArgs; i++) {
        pArgs[i] = va_arg(marker, VARIANT);
    }

    // Build DISPPARAMS
    dp.cArgs = cArgs;
    dp.rgvarg = pArgs;

    // Handle special-case for property-puts!
    if(nType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }

    // Make the call!
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp, pvResult, NULL, NULL);
    if(FAILED(hr)) {
        return hr;
    }
    // End variable-argument section...
    va_end(marker);

    delete [] pArgs;
    return hr;







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值