#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;
}