获取当前打开的WORD文件路径

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();

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值