⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsaddinloader.cpp

📁 ResOrg 图形化管理Vc项目的资源ID的工具的源代码。 ResOrg - Manage and Renumber Resource Symbol IDs Introduction The
💻 CPP
字号:
/************************************************************************
 *
 *                 Resource ID Organiser Utility Library
 *
 * (c) Copyright 2000-2002 by Anna-Jayne Metcalfe (resorg@annasplace.me.uk)
 *                         All rights reserved.
 *
 ************************************************************************
 *                                                                       
 *  Filename    : DSAddInLoader.cpp
 *
 *  Description : CDSAddInLoader - A class for configuring Visual Studio 6
 *                to load add-ins
 *
 *  Compiler    : Microsoft Visual C++ 6.0, Service Pack 3 or later
 *                                                                       
 *  Target                                                               
 *  Environment : Windows 98/NT/2000/XP
 *
 *  NOTE:
 *
 *    This software is provided "as is" free for personal use. All
 *    title and copyrights in and to the software, including but not
 *    limited to any images, text, etc. incorporated into it, are
 *    owned by Anna-Jayne Metcalfe, except where acknowledged otherwise.
 *
 *    Your may freely to use this code in your own products, PROVIDED
 *    this notice is not removed or modified.
 *
 *
 *    Visit http://www.annasplace.me.uk/resorg for latest updates
 *
 ************************************************************************
 *
 *   MODIFICATION HISTORY:
 *
 *           This is a controlled document. See project configuration
 *           control tool for latest version and full version history.
 *
 *    $Archive: /Projects/AddIns/ResOrg/ResOrgCore/DSAddInLoader.cpp $
 *   $Revision: 12 $
 *       $Date: 26/10/04 10:05 $
 *     $Author: Anna $
 *
 *    $History: DSAddInLoader.cpp $
 * 
 * *****************  Version 12  *****************
 * User: Anna         Date: 26/10/04   Time: 10:05
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed company to Riverblade
 * 
 * *****************  Version 11  *****************
 * User: Anna         Date: 15/02/03   Time: 20:42
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed big BOOLs into little bools
 * 
 * *****************  Version 10  *****************
 * User: Anna         Date: 25/11/02   Time: 15:10
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed website address in banner
 * 
 * *****************  Version 9  *****************
 * User: Anna         Date: 22/10/02   Time: 13:24
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed name/mail address (at last!)
 * 
 * *****************  Version 8  *****************
 * User: Anna         Date: 22/10/02   Time: 13:09
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Changed name/mail address (at last!)
 * 
 * *****************  Version 7  *****************
 * User: Andy         Date: 7/06/02    Time: 17:04
 * Updated in $/Projects/AddIns/ResOrg/ResOrgCore
 * Renamed the ResOrgUtils module to ResOrgCore. Updated file banners
 * accordingly
 * 
 * *****************  Version 6  *****************
 * User: Andy         Date: 8/07/01    Time: 8:32
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 1.  CDSAddInLoader::Load() now only attempts to register the add-in if
 * it is loading it
 * 2.  CDSAddInLoader::RegisterServer() now uses
 * AfxLoadLibrary()/AfxFreeLibrary() instead of the raw API calls (this
 * fixes a freeze in the Options dialog)
 * 
 * *****************  Version 5  *****************
 * User: Andy         Date: 12/05/01   Time: 6:46
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Added checks for available DevStudio versions
 * 
 * *****************  Version 4  *****************
 * User: Andy         Date: 11/05/01   Time: 20:23
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Removed duff comments
 * 
 * *****************  Version 3  *****************
 * User: Andy         Date: 2/03/01    Time: 16:41
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Write a registry entry ("HKEY_CURRENT_USER\Software\ArryTheDog
 * Software\Resource ID Organiser\Options\CreateToolbar") when the add-in
 * is registered to let it know to create its toolbars
 * 
 * *****************  Version 2  *****************
 * User: Andy         Date: 17/02/01   Time: 7:14
 * Updated in $/Projects/AddIns/ResOrg/ResOrgUtils
 * Now registers the server as well...
 * 
 * *****************  Version 1  *****************
 * User: Andy         Date: 4/12/00    Time: 18:43
 * Created in $/Projects/AddIns/ResOrg/ResOrgUtils
 * 
 *
 * $Nokeywords: $
 *
 ************************************************************************/


#include "StdAfx.h"
#include "ResOrgCore_Priv.h"

#include "DSAddInLoader.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



/////////////////////////////////////////////////////////////////////////////
// CDSAddInLoader

CDSAddInLoader::CDSAddInLoader(const CString& sName)
{
	m_sRootKey	= _T("");
	m_sName		= sName;

	CString sDevStudioVer = Options.GetDevStudioVer();
	if (sDevStudioVer.IsEmpty() )
	{
		CStringArray arrayVersions;
		GetDevStudioVersions(arrayVersions);

		if (arrayVersions.GetSize() > 0)
		{
			sDevStudioVer = arrayVersions[0];
		}
	}
	if (!sDevStudioVer.IsEmpty())
	{
		m_sRootKey	= _T("Software\\Microsoft\\DevStudio\\") +
						sDevStudioVer +
						_T("\\AddIns\\");

		ReadConfig(m_sName);
	}
}


/////////////////////////////////////////////////////////////////////////////
// CDSAddInLoader operations

int CDSAddInLoader::GetDevStudioVersions(CStringArray& rarrayVersions)
{
	CString sPath	= _T("Software\\Microsoft\\DevStudio");

	rarrayVersions.RemoveAll();
	
	HKEY hKey = NULL;

	if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER,
										sPath,
										0,
										KEY_READ,
										&hKey) )
	{
		DWORD dwIndex = 0;
		LONG lResult = 0;

		CNGQArray<CString, CString&> arrayVersions;
		do
		{
			CString sSubKey;

			// Enumerate keys - 5.0, 6.0 etc.
			// For each, enumerate keys and look for "AddIns"
			// OR just look for numerics!
			// then sort into order - use highest one as the key
			CString sKey;
			LPTSTR pszKey = sKey.GetBuffer(_MAX_PATH);
			DWORD dwSize = _MAX_PATH;
			FILETIME ftLastWriteTime;

			lResult = RegEnumKeyEx(	hKey,		// handle to key to enumerate
									dwIndex++,	// index of subkey to enumerate
									pszKey,		// address of buffer for subkey name
									&dwSize,	// address for size of subkey buffer
									NULL,		// reserved
									NULL,		// address of buffer for class string
									NULL,		// address for size of class buffer
									&ftLastWriteTime);
												// address for time key last written to
			sKey.ReleaseBuffer();

			double dVersion = 0;
			if (::IsNumeric(sKey, &dVersion) )
			{
				TRACE1("DevStudio Version %s found\n", pszKey);

				// DevStudio versions prior to 5.0 don't support
				// add-ins, so there's no need for us to check
				// for them
				if (dVersion >= 5.0)
				{
					arrayVersions.Add(sKey);
				}
			}
		} while (ERROR_SUCCESS == lResult);

		::RegCloseKey(hKey);

		arrayVersions.QuickSort(false); // Sort into descending order (highest version first)

		for (int n = 0; n < arrayVersions.GetSize(); n++)
		{
			rarrayVersions.Add(arrayVersions[n]);
		}
	}
	return rarrayVersions.GetSize();
}


bool CDSAddInLoader::Load(bool bLoad)
{
	if (!m_sName.IsEmpty())
	{
		m_bLoaded = bLoad;

		if (m_bLoaded)
		{
			if (RegisterServer())
			{
				// Force ResOrg to load its toolbar
				//
				// This is a workaround for the known DevStudio add-in
				// problem with toolbars
				CNGRegistry reg;
				reg.SetEntry(	CNGRegistry_USER,
								_T("Software\\Riverblade\\Resource ID Organiser\\Options\\CreateToolbar"),
								_T("1") );

				return WriteConfig(m_sName);
			}
		}
		else
		{
			return WriteConfig(m_sName);
		}
	}
	return false;
}


typedef HRESULT (STDAPICALLTYPE *DLLREGSVRPROC)(); 

bool CDSAddInLoader::RegisterServer(void)
{
   bool bResult = false ;

	// Path to OLE Control in m_strPathName
	HMODULE hModule = ::AfxLoadLibrary(m_sPathName) ;

	if (NULL != hModule)
	{
		DLLREGSVRPROC pfnDLLRegisterServer = (DLLREGSVRPROC)::GetProcAddress(hModule, "DllRegisterServer" ) ;

		if (NULL != pfnDLLRegisterServer)
		{
			HRESULT hResult = pfnDLLRegisterServer();

			bResult = (hResult == NOERROR); 
		}
		::AfxFreeLibrary(hModule);
	}
	return bResult;
}


bool CDSAddInLoader::SetDescription(const CString& sDesc)
{
	if (!sDesc.IsEmpty())
	{
		m_sDescription = sDesc;

		return WriteConfig(m_sName);
	}
	return false;
}


bool CDSAddInLoader::SetPathName(const CString& sPath)
{
	if (!sPath.IsEmpty())
	{
		m_sPathName = sPath;

		return WriteConfig(m_sName);
	}
	return false;
}


/////////////////////////////////////////////////////////////////////////////
// CDSAddInLoader implementation

bool CDSAddInLoader::ReadConfig(const CString& sName)
{
	if (!sName.IsEmpty())
	{
		CNGRegistry reg;

		reg.GetEntry(	CNGRegistry_USER,
						m_sRootKey + sName + _T("\\Description"),
						m_sDescription);

		reg.GetEntry(	CNGRegistry_USER,
						m_sRootKey + sName + _T("\\Filename"),
						m_sPathName);

		CString sLoad;
		reg.GetEntry(	CNGRegistry_USER,
						m_sRootKey + sName + _T("\\"),
						sLoad);

		m_bLoaded = (atoi(sLoad) > 0);

		return true;
	}
	return false;
}


bool CDSAddInLoader::WriteConfig(const CString& sName)
{
	if (!sName.IsEmpty())
	{
		CNGRegistry reg;

		reg.SetEntry(	CNGRegistry_USER,
						m_sRootKey + sName + _T("\\DisplayName"),
						sName);

		reg.SetEntry(	CNGRegistry_USER,
						m_sRootKey + sName + _T("\\Description"),
						m_sDescription);

		reg.SetEntry(	CNGRegistry_USER,
						m_sRootKey + sName + _T("\\Filename"),
						m_sPathName);

		CString sLoad = ::IntToStr(m_bLoaded);
		reg.SetEntry(	CNGRegistry_USER,
						m_sRootKey + sName + _T("\\"),
						sLoad);

		return true;
	}
	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -