OLE(Object Linking and Embedding,对象连接与嵌入)。是一种面向对象的技术,利用这种技术可开发可重复使用的COM组件。OLE不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为组件对象模型(Component Object Model),简称COM。OLE可以用来创建符合文档,复合文档包含了创建于不同源应用程序,有着不同类型的数据,因此它可以把文字、声音、图像、表格、应用程序等组合在一起。
Office提供的OLE接口可以让我们控制Office系列软件,包括打开关闭文件,往文件里写数据等一系列的事情,下面的代码通过OLE获取当前WORD打开的文件路径:
void GetActiveWordFilePath()
{
CLSID clsid;
//初始化OLE
CoInitialize(NULL);
HRESULT hr = S_FALSE;
OLECHAR FAR* szDocMember;
OLECHAR FAR* szMember;
bool bSucceeded = false;
//获取WORD对象的CLASSID
hr = CLSIDFromProgID(L"Word.Application",&clsid);
szDocMember = L"ActiveDocument";
if(FAILED(hr))
{
CoUninitialize();
return;
}
IUnknown *pUnk;
//获取当前活动对象
hr = GetActiveObject(clsid, NULL,(IUnknown**)&pUnk);
if(SUCCEEDED(hr))
{
IDispatch* pDisp;
hr = pUnk->QueryInterface(IID_IDispatch,(void**)&pDisp);
if(SUCCEEDED(hr))
{
DISPID dispid;
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
VARIANT varResult;
hr = pDisp->GetIDsOfNames(IID_NULL, &szDocMember, 1, LOCALE_USER_DEFAULT, &dispid);
if(SUCCEEDED(hr))
{
//获取ActiveDocument属性值
hr = pDisp->Invoke(dispid, IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET,&dispparamsNoArgs,&varResult,NULL,NULL);
if(SUCCEEDED(hr))
{
IDispatch* pDoc = varResult.pdispVal;
szMember = L"FullName";
hr = pDoc->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_USER_DEFAULT, &dispid);
if(SUCCEEDED(hr))
{
//获取文件路径属性值
hr = pDoc->Invoke(dispid, IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET,&dispparamsNoArgs,&varResult,NULL,NULL);
if(SUCCEEDED(hr))
{
wchar_t* wbstr = varResult.bstrVal;
DWORD dwLen = WideCharToMultiByte(CP_ACP,0, wbstr,-1,NULL,0,NULL,FALSE);
char* szResult = new char[dwLen];
WideCharToMultiByte(CP_ACP,0,wbstr,-1, szResult,dwLen,NULL,FALSE);
cout<<"当前打开的WORD文档路径:"<<szResult<<endl;
delete[] szResult;
}
}
if(pDoc != NULL)
pDoc->Release();
}
}
if(pDisp != NULL)
pDisp->Release();
}
if(pUnk != NULL)
pUnk->Release();
}
CoUninitialize();
}