简单的使用自动化技术实现用WORD读取一个XML文件的过程~

本文介绍了一个使用C++自动化技术来读取XML文件的简单过程,通过创建一个自动化管理类VZ_AutoManager,并派生出VZ_AutoWord类来控制Word应用程序,实现打开XML文件的功能。
摘要由CSDN通过智能技术生成

最近有位朋友向我问关于自动化方面的问题,两年都没用过了,于是翻出原来的代码~自动化的调用方法有很多种,我使用的是最接近C++底层的那种(汗,主要是其他的方法看不懂,我只调用一个MS Word函数,那些方法非要引入一堆库),也许最简单的最直接~

 

四个文件,贴上来

//  class: VZ_AutoManager:自动化管理类
//
//  Author: Vonger Chin(秦炜)
//  Date: 07.13.2007

#include <ole2.h>   // 就引入这一个头文件就够了

#define VZ_MAX_ARGUMENTS 0x100
#define VZ_AutoManager  AutoManager

class VZ_AutoManager
{
public:

 VZ_AutoManager();
 ~VZ_AutoManager();

 HRESULT CreateInstance(CLSID clsid);
 HRESULT CreateInstance(LPCOLESTR ProgIDName);

 HRESULT SetInvokeParam(LONG cArgs,...);
 HRESULT SetParam(LONG lArgs,...);

 HRESULT SetIDispatch(IDispatch* pDisp);
 HRESULT SetIDispatch(LPOLESTR ptName);
 HRESULT SetIDispatch(DISPID dispID);

 IDispatch* GetIDispatch();
 IDispatch* GetIDispatch(LPOLESTR ptName);
 IDispatch* GetIDispatch(DISPID dispID);

 HRESULT InvokeByID(SHORT nType, VARIANT *pvResult, DISPID dispID, LPOLESTR ptName = NULL);
 HRESULT InvokeByName(SHORT nType, VARIANT *pvResult, LPOLESTR ptName);

private:
 DISPPARAMS m_stuParam;
 LONG  m_lArgsCnt;
 IDispatch* m_pDisp;
};

 

 

#include "stdafx.h"
#include "AutoManager.h"


VZ_AutoManager::VZ_AutoManager()
{
 // Initialize COM
 ::CoInitialize(NULL);

 ZeroMemory(&m_stuParam, sizeof(DISPPARAMS));
 m_stuParam.rgvarg = new VARIANT[VZ_MAX_ARGUMENTS];
 m_stuParam.rgdispidNamedArgs = new DISPID[VZ_MAX_ARGUMENTS];
 m_lArgsCnt = VZ_MAX_ARGUMENTS;
}


VZ_AutoManager::~VZ_AutoManager()
{
 // Uninitialize Auto
 ::CoUninitialize();

 delete[] m_stuParam.rgvarg;
 delete[] m_stuParam.rgdispidNamedArgs;
}

 

// 这个函数用来导入自动化函数通过它的ID
HRESULT VZ_AutoManager::InvokeByID(SHORT nType, VARIANT *pvResult, DISPID dispID, LPOLESTR ptName)
{
 HRESULT hr;

 // Handle special-case for property-puts!
 if(nType & DISPATCH_PROPERTYPUT)
 {
  m_stuParam.cNamedArgs = 1;
  m_stuParam.rgdispidNamedArgs[0] = DISPID_PROPERTYPUT;
 }
 else
 {
  m_stuParam.cNamedArgs = 0;
 }

 hr = m_pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &m_stuParam, pvResult, NULL, NULL);
 if(FAILED(hr))
 {
  TCHAR buffer[VZ_MAX_ARGUMENTS];
  if(ptName)
   ::wsprintf(buffer, TEXT("IDispatch::Invoke(0x%x:%s) failed 0x%8x"), dispID, ptName, hr);
  else
   ::wsprintf(buffer, TEXT("IDispatch::Invoke(0x%x) failed 0x%8x"), dispID, hr);
  MessageBox(NULL, buffer, TEXT("Error"), MB_OK|MB_ICONERROR);
  return hr;
 }

 return hr;
}

 

// 这个函数用来导入自动化函数通过它的Name
HRESULT VZ_AutoManager::InvokeByName(SHORT nType, VARIANT *pvResult, LPOLESTR ptName)
{
 HRESULT hr;
 DISPID dispID;

 // Get DISPIP by Names
 hr = m_pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
 if(FAILED(hr))
 {
  TCHAR buffer[VZ_MAX_ARGUMENTS];
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值