📄 dsaddinloader.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 + -