枚举所有打开的Office文件路径

本文介绍了一种使用C++编程语言获取当前所有打开的Office文件路径的方法,包括Word和Excel等应用,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章说了怎么得到当前活动的WORD文件路径,那如果当前打开了好多WORD,EXCEL等Office文件的话,那个方法也只能获取到当前获得焦点的实例所打开的文件。

其实还有一种方法可以获取到所有打开的Office文件路径,其实不光是Office,包括VS的实例也会被列出来,具体代码如下:

#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <tchar.h>
#include <iostream>

using namespace std;

#pragma comment(lib,"Ole32.lib")
#pragma comment(lib,"OleAut32.lib")

bool EnumAllOfficeFilePath()
{
	CLSID clsid;
	CoInitialize(NULL);
	HRESULT hr = S_FALSE;	
	
	IRunningObjectTable* pRot = NULL;
	IEnumMoniker* pEnumMoniker = NULL;
	IMoniker* pMoniker = NULL;
	hr = GetRunningObjectTable(0,&pRot);
	if(FAILED(hr))
	{
		cout<<"GetRunningObjectTable failed"<<endl;
		return false;
	}
	
	hr = pRot->EnumRunning(&pEnumMoniker);
	if(FAILED(hr))
	{
		cout<<"EnumRunning failed"<<endl;
		return false;
	}
	
	hr = pEnumMoniker->Reset();
	if(FAILED(hr))
	{
		cout<<"Reset failed"<<endl;
		return false;
	}

	IBindCtx *pbc;
	CreateBindCtx(0, &pbc);
	int index = 1;
		
	while( (hr = pEnumMoniker->Next(1, &pMoniker,NULL)) ==S_OK)
	{
		OLECHAR* szDisplayName;
		hr = pMoniker->GetDisplayName(pbc,NULL, &szDisplayName);
		if(FAILED(hr))
		{
			cout<<"GetDisplayName failed"<<endl;	
		}
		else
		{
			DWORD dwLen = WideCharToMultiByte(CP_ACP,0, szDisplayName,-1,NULL,0,NULL,FALSE);
			char* szResult = new char[dwLen];
			WideCharToMultiByte(CP_ACP,0,szDisplayName,-1, szResult,dwLen,NULL,FALSE);
			printf("%d:%s\n",index++, szResult);		
			delete[] szResult;

		}
		
		pMoniker->Release();
	}
	
	pbc->Release();
	pEnumMoniker->Release();
	pRot->Release();
	
	CoUninitialize();
	return true;
}


int main(int argc, char* argv[])
{
	EnumAllOfficeFilePath();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值