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

来源:互联网 发布:淘宝如何开好直通车 编辑:程序博客网 时间:2024/05/22 22:35

上一篇文章说了怎么得到当前活动的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;}


0 0
原创粉丝点击