头文件如下:
#pragma once
#include <Windows.h>
#include <tchar.h>
class CJudgeOfficeVersion
{
public:
CJudgeOfficeVersion();
~CJudgeOfficeVersion();
public:
BOOL JudgeVersion(OUT LPTSTR _lpVersion, IN DWORD _dwVersionBufferLen);
};
实现文件如下:
#include "JudgeOfficeVersion.h"
#include <strsafe.h>
/*
* 函数名称:CJudgeOfficeVersion
* 函数功能:构造函数
* 函数参数:无
* 函数返回:无
* 函数备注:无
* 编 写 人:刘鹏春
*/
CJudgeOfficeVersion::CJudgeOfficeVersion()
{
}
/*
* 函数名称:~CJudgeOfficeVersion
* 函数功能:析构函数
* 函数参数:无
* 函数返回:无
* 函数备注:无
* 编 写 人:刘鹏春
*/
CJudgeOfficeVersion::~CJudgeOfficeVersion()
{
}
/*
* 函数名称:JudgeVersion
* 函数功能:判断版本
* 函数参数:1字符指针;2指针长度;
* 函数返回:判断状态
* 函数备注:通过ProgID查找CLSID查询服务器中记录的Office版本信息
* 该代码源自:http://support.microsoft.com/kb/247985/zh-cn
* 编 写 人:刘鹏春
*/
BOOL CJudgeOfficeVersion::JudgeVersion(OUT LPTSTR _lpVersion, IN DWORD _dwVersionBufferLen)
{
HKEY hKey;
HKEY hSubKey;
LONG lResult = 0L;
TCHAR szValueName[128] = {_T("CurVer")};
TCHAR szKey[128] = {_T("Excel.Application")};
lResult = RegOpenKeyEx(
HKEY_CLASSES_ROOT,
szKey,
0,
KEY_ALL_ACCESS,
&hKey
);
if (ERROR_SUCCESS != lResult) {
MessageBox(NULL, _T("Could not get CLSID from ProgID, Make sure ProgID is correct."), _T("提示"), MB_OK);
return FALSE;
}
lResult = RegOpenKeyEx(
hKey,
szValueName,
0,
KEY_ALL_ACCESS,
&hSubKey
);
if (ERROR_SUCCESS != lResult) {
MessageBox(NULL, _T("Excel is registered, but no local server can be found!"), _T("提示"), MB_OK);
return FALSE;
}
lResult = RegQueryValueEx(hSubKey, NULL, NULL, NULL, (LPBYTE)_lpVersion, &_dwVersionBufferLen);
RegCloseKey(hSubKey);
RegCloseKey(hKey);
if (ERROR_SUCCESS != lResult) {
return FALSE;
}
PTCHAR pszVersionNumber = _tcsrchr(_lpVersion, _T('.'));
PTCHAR pVersion = (pszVersionNumber + 1);
INT nVersion = _ttoi(pVersion);
ZeroMemory(_lpVersion, _dwVersionBufferLen);
switch (nVersion)
{
case 0:
case 1:
case 2:
case 3:
case 5:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office 95以前版本"));
break;
case 6:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office 95"));
break;
case 8:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office 97"));
break;
case 9:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office 2000"));
break;
case 10:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office XP"));
break;
case 11:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office 2003"));
break;
case 12:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office 2007"));
break;
case 13:
case 14:
case 15:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Office 2010"));
break;
default:
StringCchCopy(_lpVersion, _dwVersionBufferLen, _T("Version 2010以后版本"));
}
return TRUE;
}
测试用例如下:
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include "JudgeOfficeVersion.h"
#include <strsafe.h>
BOOL _tmain(IN INT _iArgc, PTCHAR* _szArgv)
{
BOOL bStatus = FALSE;
TCHAR szVersion[500] = {0};
CJudgeOfficeVersion* pJudgeOfficeVersion = NULL;
pJudgeOfficeVersion = new CJudgeOfficeVersion();
if (!pJudgeOfficeVersion) {
return bStatus;
}
bStatus = pJudgeOfficeVersion->JudgeVersion(szVersion, 500);
if (!bStatus) {
delete pJudgeOfficeVersion;
pJudgeOfficeVersion = NULL;
return bStatus;
}
if (pJudgeOfficeVersion) {
delete pJudgeOfficeVersion;
pJudgeOfficeVersion = NULL;
}
_tprintf(szVersion);
system("pause");
return bStatus;
}