用C实现Excel的OLE自动化

用C实现Excel的OLE自动化

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argc, char *argv[])
{
//定义变量,在windows.h中定义了ole的c实现函数
IDispatch *pDisp; //Dispatch接口指针
unsigned short *ucPtr; //存储接口名称的临时变量
DISPID dispID; //根据ucPtr获取的接口ID
CLSID clsid; //主接口ID
HRESULT hr;
char buf[8192]; //buffer for output

//定义在IDispatch::Invoke()中需要使用的参数
DISPPARAMS dispParams={NULL,NULL,0,0};
VARIANT parm1; //用于存储参数数组
DISPID dispdNamed=DISPID_PROPERTYPUT; //用于设置dispParams.rgdispidNamedArgs
//步骤1 初始化com库
OleInitialize(NULL);
//步骤2 获取Excel组件的CLSID
hr=CLSIDFromProgID(L"Excel.Application",&clsid);
if(FAILED(hr))
{
   MessageBox(NULL,"Excel没有正确注册.","Error",MB_SETFOREGROUND);

    return;
}

//步骤3 运行Excel实例并获取它的IDispatch指针
hr=CoCreateInstance(&clsid,NULL,CLSCTX_LOCAL_SERVER,&IID_IDispatch,(void**)&pDisp);
if(FAILED(hr))
{
MessageBox(NULL,"无法启动Excel","Error",MB_SETFOREGROUND);
return;
}

//步骤4 将excel的Visible属性设置为1
//首先获得该属性的DISPID
ucPtr=L"Visible";
pDisp->lpVtbl->GetIDsOfNames(pDisp,&IID_NULL,&ucPtr,1,LOCALE_USER_DEFAULT,&dispID);
sprintf(buf,"DISPID for visible property=0x%08lx",dispID);
MessageBox(NULL,buf,"Debug Notice",MB_SETFOREGROUND);

//然后设置在Invoke中使用的参数
VariantInit(&parm1);
parm1.vt =VT_I4;
parm1.lVal=1;
dispParams.cArgs =1;
dispParams.rgvarg =&parm1;
dispParams.cNamedArgs =1;
dispParams.rgdispidNamedArgs =&dispdNamed;
//实际设置        
hr=pDisp->lpVtbl->Invoke(pDisp,dispID,&IID_NULL,LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYPUT|DISPATCH_METHOD,&dispParams,NULL,NULL,NULL);
if(FAILED(hr))
{
        sprintf(buf,"IDispatch:;Invoke() failed with %081x",hr);
        MessageBox(NULL,buf,"Debug Notice",MB_SETFOREGROUND);
}

MessageBox(NULL,"Done","Notice",MB_SETFOREGROUND);

//步骤5 卸载com库
OleUninitialize();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值