C++判斷Office版本

頭文件如下:

#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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章