最近有位朋友向我问关于自动化方面的问题,两年都没用过了,于是翻出原来的代码~自动化的调用方法有很多种,我使用的是最接近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];