Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

The Ultimate Toolbox - Updates and User Contributions

, 12 Feb 2013
Updates and User Contributions for the Ultimate Toolbox Libraries
OutlookDemoUpdate.zip
Ultimate Grid
Demos
OutlookStyle
OutlookStyle.aps
OutlookStyle.dsp
OutlookStyle.dsw
OutlookStyle.suo
res
bitmap1.bmp
bmattach.bmp
bmp00001.bmp
bmp00002.bmp
bmp00003.bmp
Flags.bmp
OutlookStyle.ico
OutlookStyleDoc.ico
Toolbar.bmp
toolbar1.bmp
toolbar2.bmp
toolbarf.bmp
UltimateGrid72_Src_Update01.zip
CellTypes
Include
Source
UltimateGrid72_Src_Update02.zip
DataSources
ODBC
OleDB
EditControls
UltimateGrid72_Src_Update03.zip
UltimateGrid72_Src_Update04.zip
UltimateGrid73_src.zip
BuildDLL
Build DLL.dsp
Build DLL.dsw
res
BuildLib
ugmfclib.dsp
ugmfclib.dsw
Lib
Skel
UltimateTCP-IP42_Src_Update01.zip
Ultimate TCP-IP
Include
Security
Include
Source
source
UltimateTCP-IP42_Src_Update02.zip
Examples
Client
Mail
icon1.ico
icon2.ico
MailClientS.suo
test.dsp
test.dsw
UltimateTCP-IP42_Src_Update03.zip
ultimatetoolbox93_src_update01.zip
Ultimate Toolbox
include
source
UltimateToolbox93_Src_Update02.zip
lib
Build DLLs
Build Libs
UltimateToolbox93_Src_Update03.zip
UltimateToolbox93_Src_Update04.zip
UltimateToolbox93_Src_Update05.zip
// ==========================================================================
// 							Class Specification : 
//								COXDLLManager
// ==========================================================================

// Header file : OXDLLManager.h

// Version: 9.3

// This software along with its related components, documentation and files ("The Libraries")
// is � 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement").  Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office.  For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
                         
// //////////////////////////////////////////////////////////////////////////

#ifndef _DLLMANAGER_H
#define _DLLMANAGER_H

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "OXDllExt.h"


#ifndef _INC_TOOLHELP32
#include "tlhelp32.h"
#define _INC_TOOLHELP32
#endif

#ifndef __AFXTEMPL_H__
#include <afxtempl.h>
#endif


// tell linker to link with version.lib for VerQueryValue, etc.
#pragma comment(linker, "/defaultlib:version.lib")

// v9.3 - update 03 - 64-bit - added extra VC6 guard here - TD
#if _MSC_VER < 1400
#ifndef DWORD_PTR // for VC++ 6
	typedef DWORD DWORD_PTR;
#endif
#endif

// we need these type definitions to get information about dll version
// we use it in our GetDLLVersionInfo function
#ifndef _OXDLLVERSIONINFO_DECL
#define _OXDLLVERSIONINFO_DECL
#if _MFC_VER >0x0421
#include <shlwapi.h>
#else
typedef struct _DllVersionInfo
{
	DWORD cbSize;
	DWORD dwMajorVersion;
	DWORD dwMinorVersion;
	DWORD dwBuildNumber;
	DWORD dwPlatformID;
}DLLVERSIONINFO;
#define DLLVER_PLATFORM_WINDOWS		0	// Windows platform (95/98)
#define DLLVER_PLATFORM_NT			1	// Windows NT platform
typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
#endif
#endif
///////////////////////////

typedef struct _tagTRANSLATION 
{
	WORD nLangID;			// language ID
	WORD nCharset;			// character set (code page)

} TRANSLATION;

typedef struct _tagDLLFILEINFO
{
	VS_FIXEDFILEINFO fixedInfo;
	TRANSLATION translation;
	CString sCompanyName;
	CString sFileDescription;
	CString sFileVersion;
	CString sInternalName;
	CString sLegalCopyright;
	CString sOriginalFilename;
	CString sProductName;
	CString sProductVersion;

} DLLFILEINFO;
////////////////////////////

typedef struct _tagDLLSNAPSHOT
{
	int nRefCount;
	CStringArray arrDependantProcesses;

} DLLSNAPSHOT;



typedef struct _tagMODULEINFO
{
	HMODULE hModule;
	CString sModuleFileName;

	_tagMODULEINFO(HMODULE Module=NULL, CString ModuleFileName=_T(""))
	{
		hModule=Module;
		sModuleFileName=ModuleFileName;
	}

    // assignment operator
	_tagMODULEINFO& operator=(const _tagMODULEINFO& mi)
	{
		if(this==&mi)
			return *this;
		
		hModule=mi.hModule;
		sModuleFileName=mi.sModuleFileName;
		return *this;
	}

    // compare operator
	BOOL operator==(const _tagMODULEINFO mi) const 
	{
		return ((hModule==mi.hModule)&
			(sModuleFileName.CompareNoCase(mi.sModuleFileName)==0));
	}

/*	operator DWORD() const
	{
		UINT nHandleHash=((DWORD)hModule) >> 4;
		UINT nFileNameHash=0;
		LPCTSTR key=(LPCTSTR)sModuleFileName;
		while(*key)
			nFileNameHash=(nFileNameHash<<5)+nFileNameHash+*key++;
		return (DWORD)(nHandleHash>>2+nFileNameHash<<2);
	}
*/
} MODULEINFO;

#ifdef _BUILD_UTB_INTO_EXTDLL
	template UINT AFXAPI HashKey<MODULEINFO> (MODULEINFO moduleInfo);
#else
	template<> UINT AFXAPI HashKey<MODULEINFO> (MODULEINFO moduleInfo);
#endif

typedef CMap<MODULEINFO,MODULEINFO,int,int> CModuleMap;

typedef struct _tagPROCESSINFO
{
	HMODULE hProcessModule;
	CModuleMap moduleMap;

	virtual ~_tagPROCESSINFO()
	{
		moduleMap.RemoveAll();
	}

} PROCESSINFO;

class CProcessModulesMap : public CMap<DWORD_PTR,DWORD_PTR,PROCESSINFO*,PROCESSINFO*> 
{
public:
	virtual ~CProcessModulesMap()
	{
		POSITION pos=GetStartPosition();
		while(pos!=NULL)
		{
			// v9.3 - update 03 - 64-bit - switch param type - TD
#ifdef _WIN64
			DWORD_PTR dwProcessID;
#else 
			DWORD dwProcessID;
#endif
			PROCESSINFO* pProcessInfo;
			GetNextAssoc(pos,dwProcessID,pProcessInfo);
			ASSERT(pProcessInfo!=NULL);
			delete pProcessInfo;
		}

		RemoveAll();
	}
};




//==================== typedefs for ToolHelp32 functions =====================

typedef HANDLE (WINAPI* PFNCREATETOOLHELP32SNAPSHOT)
		(DWORD dwFlags, DWORD th32ProcessID);
    
typedef BOOL (WINAPI* PFNPROCESS32FIRST)
		(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
    
typedef BOOL (WINAPI* PFNPROCESS32NEXT)
		(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
    
typedef BOOL (WINAPI* PFNMODULE32FIRST)
		(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
    
typedef BOOL (WINAPI* PFNMODULE32NEXT)
		(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
    

//====================== typedefs for PSAPI.DLL functions =====================

typedef BOOL (WINAPI* PFNENUMPROCESSES)
		(DWORD* lpidProcess, DWORD cb, DWORD* cbNeeded);

typedef BOOL (WINAPI* PFNENUMPROCESSMODULES)
		(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);

typedef DWORD (WINAPI* PFNGETMODULEFILENAMEEXA)
		(HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize);


/////////////////////////////////////////////////////////////////////////////
// COXDLLManager window

class OX_CLASS_DECL COXDLLManager
{
// Construction
public:
	COXDLLManager();
	COXDLLManager(LPCTSTR lpLibFileName);
	COXDLLManager(LPCTSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);

// Attributes
public:

protected:
	static BOOL m_bIsWindowsNT;

	HMODULE m_hModule;
	BOOL m_bWasAlreadyLoaded;
	BOOL m_bIsOwningModule;


// Operations
public:
	// static functions
	static BOOL IsWindowsNTRunning();
	static BOOL GetAllLoadedDLLs(CProcessModulesMap& mapProcessModules);
	static BOOL GetProcessLoadedDLLs(HINSTANCE hInstance, 
		CModuleMap& mapModules);

	inline static BOOL GetVersionInfo(HMODULE hModule, DLLVERSIONINFO* pdvi) 
	{
		COXDLLManager dll;
		if(!dll.Attach(hModule,FALSE))
			return FALSE;
		return dll.GetVersionInfo(pdvi);
	}
	
	inline static BOOL GetVersionInfo(LPCTSTR lpLibFileName, DLLVERSIONINFO* pdvi) 
	{
		COXDLLManager dll(lpLibFileName);
		if(!dll.IsLoaded())
			return FALSE;
		return dll.GetVersionInfo(pdvi);
	}

	inline static BOOL GetFileInfo(HMODULE hModule, DLLFILEINFO* pdfi) 
	{
		COXDLLManager dll;
		if(!dll.Attach(hModule,FALSE))
			return FALSE;
		return dll.GetFileInfo(pdfi);
	}
	inline static BOOL GetFileInfo(LPCTSTR lpLibFileName, DLLFILEINFO* pdfi) 
	{
		COXDLLManager dll(lpLibFileName);
		if(!dll.IsLoaded())
			return FALSE;
		return dll.GetFileInfo(pdfi);
	}
	
	inline static BOOL GetSnapshot(HMODULE hModule, DLLSNAPSHOT* pSnapshot) 
	{
		COXDLLManager dll;
		if(!dll.Attach(hModule,FALSE))
			return FALSE;
		return dll.GetSnapshot(pSnapshot);
	}
	
	inline static BOOL GetSnapshot(LPCTSTR lpLibFileName, DLLSNAPSHOT* pSnapshot) 
	{
		COXDLLManager dll(lpLibFileName);
		if(!dll.IsLoaded())
			return FALSE;
		return dll.GetSnapshot(pSnapshot);
	}

	inline static BOOL GetReferenceCount(HMODULE hModule, int& nRefCount) 
	{
		COXDLLManager dll;
		if(!dll.Attach(hModule,FALSE))
			return FALSE;
		return dll.GetReferenceCount(nRefCount);
	}

	inline static BOOL GetReferenceCount(LPCTSTR lpLibFileName, int& nRefCount) 
	{
		COXDLLManager dll(lpLibFileName);
		if(!dll.IsLoaded())
			return FALSE;
		return dll.GetReferenceCount(nRefCount);
	}

	inline static BOOL GetDependantProcesses(HMODULE hModule, 
		CStringArray& arrDependantProcesses) 
	{
		COXDLLManager dll;
		if(!dll.Attach(hModule,FALSE))
			return FALSE;
		return dll.GetDependantProcesses(arrDependantProcesses);
	}
	
	inline static BOOL GetDependantProcesses(LPCTSTR lpLibFileName, 
		CStringArray& arrDependantProcesses) 
	{
		COXDLLManager dll(lpLibFileName);
		if(!dll.IsLoaded())
			return FALSE;
		return dll.GetDependantProcesses(arrDependantProcesses);
	}
	///////////////////////////////////////

	inline BOOL IsLoaded() const { 
		return ((m_hModule!=NULL)&(m_bIsOwningModule)) ? TRUE : FALSE; }

	// counterparts of existing functions
	//
	HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);
	HINSTANCE LoadLibraryEx(LPCTSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);

	BOOL FreeLibrary();

	inline void FreeLibraryAndExitThread(DWORD dwExitCode) 
	{
		ASSERT(IsLoaded());
		::FreeLibraryAndExitThread(m_hModule,dwExitCode);
	}
  
	inline HRSRC FindResource(LPCTSTR lpName, LPCTSTR lpType) const 
	{
		ASSERT(IsLoaded());
		return ::FindResource(m_hModule,lpName,lpType);
	}

	inline HRSRC FindResourceEx(LPCTSTR lpName, LPCTSTR lpType, WORD wLanguage) const 
	{
		ASSERT(IsLoaded());
		return ::FindResourceEx(m_hModule,lpName,lpType,wLanguage);
	}

	inline HGLOBAL LoadResource(HRSRC hResInfo) const 
	{
		ASSERT(IsLoaded());
		return ::LoadResource(m_hModule,hResInfo);
	}

	inline BOOL DisableThreadLibraryCalls() const 
	{
		ASSERT(IsLoaded());
		return ::DisableThreadLibraryCalls(m_hModule);
	}

	inline HMODULE GetModuleHandle() const { return m_hModule; }

	inline DWORD GetModuleFileName(LPTSTR lpFilename, DWORD nSize) const 
	{ 
		ASSERT(lpFilename!=NULL);
		return ::GetModuleFileName(m_hModule,lpFilename,nSize);
	}

	inline FARPROC GetProcAddress(LPCSTR lpProcName) const 
	{
		ASSERT(lpProcName!=NULL);
		ASSERT(IsLoaded());
		return ::GetProcAddress(m_hModule,lpProcName);
	}
	//////////////////////////////////////////
	

	BOOL Attach(HMODULE hModule, BOOL bUnloadOnDestroy);

	inline HMODULE Detach() 
	{
		HMODULE hModule=m_hModule;
		Reset();
		return hModule;
	}


	BOOL GetVersionInfo(DLLVERSIONINFO* pdvi) const;
	BOOL GetFileInfo(DLLFILEINFO* pdfi) const;

		
	BOOL GetSnapshot(DLLSNAPSHOT* pSnapshot) const;

	inline BOOL GetReferenceCount(int& nRefCount) const 
	{
		DLLSNAPSHOT snapShot;
		if(GetSnapshot(&snapShot))
		{
			nRefCount=snapShot.nRefCount;
			return TRUE;
		}
		else
			return FALSE;
	}

	inline BOOL GetDependantProcesses(CStringArray& arrDependantProcesses) const 
	{
		DLLSNAPSHOT snapShot;
		if(GetSnapshot(&snapShot))
		{
			arrDependantProcesses.RemoveAll();
			arrDependantProcesses.Append(snapShot.arrDependantProcesses);
			return TRUE;
		}
		else
			return FALSE;
	}

protected:
	inline void Reset() 
	{
		m_hModule=NULL;
		m_bWasAlreadyLoaded=FALSE;
		m_bIsOwningModule=TRUE;
	}

	CString	GetFileInfoValue(const LPBYTE pFileVersionInfo, WORD nLangID, 
		WORD nCharset, LPCTSTR lpKeyName) const;


// Implementation
public:
	virtual ~COXDLLManager();
};

/////////////////////////////////////////////////////////////////////////////
#endif	//	_DLLMANAGER_H

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

The Ultimate Toolbox
Web Developer
Canada Canada
In January 2005, David Cunningham and Chris Maunder created TheUltimateToolbox.com, a new group dedicated to the continued development, support and growth of Dundas Software’s award winning line of MFC, C++ and ActiveX control products.
 
Ultimate Grid for MFC, Ultimate Toolbox for MFC, and Ultimate TCP/IP have been stalwarts of C++/MFC development for a decade. Thousands of developers have used these products to speed their time to market, improve the quality of their finished products, and enhance the reliability and flexibility of their software.
Group type: Organisation

375 members


| Advertise | Privacy | Mobile
Web01 | 2.8.140721.1 | Last Updated 13 Feb 2013
Article Copyright 2008 by The Ultimate Toolbox
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid