VC检测Office版本
来源:互联网 发布:哆啦A梦 知乎 编辑:程序博客网 时间:2024/06/06 14:26
现在做的一个项目,里边用到了ActiveX控件,内嵌了Word,在安装Word的电脑运行是没问题的,但是在没有Word环境的电脑上就出问题,所以需要检测一下当前机器是否安装了Office,然后做出友好提示。在网上找了一个类(类的声明实现都在.h文件里,用的时候包含一下就行了),挺好用的,原理是搜索注册表,查看是否存在Office注册表文件,如果已安装,便获得当前Office版本的详细信息,如果没安装,返回 Not found. 这个类贴在下边了,后边还附了使用示例,兄弟们拿走不谢(借花献佛吧)。
class OfficeVersion{public:enum eOfficeVersion{eOfficeVersion_Unknown, // error return valueeOfficeVersion_95,eOfficeVersion_97,eOfficeVersion_2000,eOfficeVersion_XP, // XP = 2002 + marketingeOfficeVersion_2003,eOfficeVersion_2007,eOfficeVersion_2010,eOfficeVersion_2013,};enum eOfficeApp // in case you are looking for a particular app{eOfficeApp_Word,eOfficeApp_Excel,eOfficeApp_Outlook,eOfficeApp_Access,eOfficeApp_PowerPoint,};static CString GetVersionAsString(const eOfficeVersion officeVersion){switch(officeVersion) {case eOfficeVersion_Unknown: { return _T("Not found"); }break;case eOfficeVersion_95: { return _T("Office 95"); }break;case eOfficeVersion_97: { return _T("Office 97"); }break;case eOfficeVersion_2000: { return _T("Office 2000"); }break;case eOfficeVersion_XP: { return _T("Office XP"); }break;case eOfficeVersion_2003: { return _T("Office 2003"); }break;case eOfficeVersion_2007: { return _T("Office 2007"); }break;case eOfficeVersion_2010: { return _T("Office 2010"); }break;case eOfficeVersion_2013: { return _T("Office 2013"); }break;default: { ASSERT(false); return _T(""); }break; // added another ???}}static CString GetApplicationAsString(const eOfficeApp officeApp){switch(officeApp) {case eOfficeApp_Word: { return _T("Word"); }break;case eOfficeApp_Excel: { return _T("Excel"); }break;case eOfficeApp_Outlook: { return _T("Outlook"); }break;case eOfficeApp_Access: { return _T("Access"); }break;case eOfficeApp_PowerPoint: { return _T("Powerpoint"); }break;default: { ASSERT(false); return _T(""); }break; // added another ???}}static CString GetProgID(const eOfficeApp officeApp){// ProgIDs from http://support.microsoft.com/kb/240794/EN-US/switch(officeApp) {case eOfficeApp_Word: { return _T("Word.Application"); }break;case eOfficeApp_Excel: { return _T("Excel.Application"); }break;case eOfficeApp_Outlook: { return _T("Outlook.Application"); }break;case eOfficeApp_Access: { return _T("Access.Application"); }break;case eOfficeApp_PowerPoint: { return _T("Powerpoint.Application"); }break;default: { ASSERT(false); return _T(""); }break; // added another ???}}static eOfficeVersion StringToVersion(const CString& versionString){// mapping between the marketing version (e.g. 2003) and the behind-the-scenes versionif(_T("7") == versionString){return eOfficeVersion_95;}else if(_T("8") == versionString){return eOfficeVersion_97;}else if(_T("9") == versionString){return eOfficeVersion_2000;}else if(_T("10") == versionString){return eOfficeVersion_XP;}else if(_T("11") == versionString){return eOfficeVersion_2003;}else if(_T("12") == versionString){return eOfficeVersion_2007;}else if(_T("14") == versionString){return eOfficeVersion_2010;}else if(_T("15") == versionString){return eOfficeVersion_2013;}else{return eOfficeVersion_Unknown; // added another ???}}static eOfficeVersion GetOfficeVersion(){// by default we use Word (and so on, down the list) as a proxy for "Office" // (i.e. if word is there then "Office" is there)// if you want something more specific, then call GetApplicationVersion()static const eOfficeApp appsToCheck[] = {eOfficeApp_Word,eOfficeApp_Excel,eOfficeApp_Outlook,eOfficeApp_Access,eOfficeApp_PowerPoint,};const int numItems( sizeof(appsToCheck) / sizeof(appsToCheck[0]) );for(int i=0; i<numItems; ++i){const eOfficeVersion thisAppVersion( GetApplicationVersion(eOfficeApp_Word) );if(eOfficeVersion_Unknown != thisAppVersion){return thisAppVersion;}}return eOfficeVersion_Unknown; // probably nothing installed}static eOfficeVersion GetApplicationVersion(eOfficeApp appToCheck){// some of this function is based on the code in the article at: http://support.microsoft.com/kb/q247985/const CString progID( GetProgID(appToCheck) );HKEY hKey( NULL);HKEY hKey1(NULL);if(ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CLASSES_ROOT, progID, 0, KEY_READ, &hKey) ){return eOfficeVersion_Unknown;}if(ERROR_SUCCESS != ::RegOpenKeyEx(hKey, _T("CurVer"), 0, KEY_READ, &hKey1)) {::RegCloseKey(hKey);return eOfficeVersion_Unknown;} // Get the Version informationconst int BUFFER_SIZE(255);ULONG cSize(BUFFER_SIZE);TCHAR szVersion[BUFFER_SIZE];const LONG lRet( ::RegQueryValueEx(hKey1, NULL, NULL, NULL, (LPBYTE)szVersion, &cSize) );// Close the registry keys::RegCloseKey(hKey1);::RegCloseKey(hKey);// Error while querying for valueif(ERROR_SUCCESS != lRet){return eOfficeVersion_Unknown;}const CString progAndVersion(szVersion);// At this point szVersion contains the ProgID followed by a number. // For example, Word 97 will return Word.Application.8 and Word 2000 will return Word.Application.9const int lastDot( progAndVersion.ReverseFind(_T('.')) );const int firstCharOfVersion( lastDot + 1); // + 1 to get rid of the dot at the frontconst CString versionString( progAndVersion.Right(progAndVersion.GetLength() - firstCharOfVersion) );return StringToVersion(versionString);}};
使用示例:
OfficeVersion::eOfficeVersion eOffVer = OfficeVersion::GetApplicationVersion( OfficeVersion::eOfficeApp_Word )//OfficeVersion::eOfficeApp_Word 代表查询的是word版本, OfficeVersion::eOfficeApp_Excel, OfficeVersion::eOfficeApp_Outlook, OfficeVersion::eOfficeApp_Access, OfficeVersion::eOfficeApp_PowerPoint,分别对应的是各自版本(就不一一说了,含义大家都看得懂的)CString strVersion = OfficeVersion::GetVersionAsString( eOffVer);//返回版本信息
0 0
- VC检测Office版本
- HOW TO:Office文档版本的检测
- 检测本机Office(excel/word)版本
- C#通过操作注册表检测office版本
- (VC,MFC) 检测操作系统版本
- 如何检测当前机器中是否安装Office 及其版本??
- 解决方案:mathtype检测到一个不支持的版本office
- office版本
- vc 取windows系统信息 版本 cpu信息 内存信息 ie版本信息 office版本
- vc 取windows系统信息 版本 cpu信息 内存信息 ie版本信息 office版本
- VC 2010 office 界面
- 获取office版本
- C++判断Office版本
- 获取office版本
- 改变 Office 的版本
- Office application 版本
- Office 多版本共存
- VC对Office进行操作
- 硬件调试
- java Date型时间比较大小
- HDU 4004 The Frog's Games (二分)
- (C#)动态调用web服务
- C#获取变更过的DataTable记录的实现方法
- VC检测Office版本
- Android清除浏览器缓存
- 关于html:errors与html:messages标签的问题
- R语言简单总结
- 控件旋转frame的计算
- View的事件分发
- Unity 加载网络图片
- Android6.0源码分析—— Zygote进程分析(补充)
- popuwindow的显示与隐藏问题