頭文件如下:
#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;
}