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

📄 compreg.h

📁 在Visual C++.NET下COM+组件的实现
💻 H
字号:
// compreg.h : CCompReg 的声明

#pragma once

#include "resource.h"       // 主符号
#include "comPlus.h"


// CCompReg
class ATL_NO_VTABLE CCompReg : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CCompReg, &CLSID_CompReg>,
	public IDispatchImpl<IComponentRegistrar, &IID_IComponentRegistrar, &LIBID_comPlusLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
	CCompReg()
	{
	}

DECLARE_NO_REGISTRY()

BEGIN_COM_MAP(CCompReg)
	COM_INTERFACE_ENTRY(IComponentRegistrar)
	COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// IComponentRegistrar
public:
    STDMETHOD(Attach)(BSTR bstrPath)
	{
		return S_OK;
	}
	STDMETHOD(RegisterAll)()
	{
		return _AtlComModule.RegisterServer(TRUE);
	}
	STDMETHOD(UnregisterAll)()    
	{
		_AtlComModule.UnregisterServer(TRUE);
		return S_OK;
	}
	STDMETHOD(GetComponents)(SAFEARRAY **ppCLSIDs, SAFEARRAY **ppDescriptions)
	{
		if( ppCLSIDs == NULL || ppDescriptions == NULL )
			return E_POINTER;
		int nComponents = 0;
		for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
		{
			if (*ppEntry != NULL)
			{
				_ATL_OBJMAP_ENTRY* pEntry = *ppEntry;
				if (pEntry->pclsid != NULL)
				{
					LPCTSTR pszDescription = pEntry->pfnGetObjectDescription();
					if (pszDescription)
						nComponents++;
				}
			}
		}
		SAFEARRAYBOUND rgBound[1];
		rgBound[0].lLbound = 0;
		rgBound[0].cElements = nComponents;
		*ppCLSIDs = SafeArrayCreate(VT_BSTR, 1, rgBound);
		if( *ppCLSIDs == NULL )
			return AtlHresultFromLastError();
		*ppDescriptions = SafeArrayCreate(VT_BSTR, 1, rgBound);
		if( *ppDescriptions == NULL )
			return AtlHresultFromLastError();
		LONG i = 0;
		for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
		{
			if (*ppEntry != NULL)
			{
				_ATL_OBJMAP_ENTRY* pEntry = *ppEntry;
				if (pEntry->pclsid != NULL)
				{
					LPCTSTR pszDescription = pEntry->pfnGetObjectDescription();
					if (pszDescription)
					{
						LPOLESTR pszCLSID;
						StringFromCLSID(*pEntry->pclsid, &pszCLSID);
						BSTR pBSTR = OLE2BSTR(pszCLSID);
						if( pBSTR == NULL )
						{
							CoTaskMemFree(pszCLSID);
							return E_OUTOFMEMORY;
						}
						HRESULT hResult = SafeArrayPutElement(*ppCLSIDs, &i, pBSTR);
						CoTaskMemFree(pszCLSID);
						if( FAILED(hResult) )
							return hResult;
						pBSTR = T2BSTR_EX(pszDescription);
						if( pBSTR == NULL )
						{
							return E_OUTOFMEMORY;
						}
						hResult = SafeArrayPutElement(*ppDescriptions, &i, pBSTR);
						if( FAILED(hResult) )
							return hResult;
						i++;
					}
				}
			}
		}

		return S_OK;
	}
	STDMETHOD(RegisterComponent)(BSTR bstrCLSID)
	{
		CLSID clsid;
		CLSIDFromString(bstrCLSID, &clsid);
		_AtlComModule.RegisterServer(TRUE, &clsid);
		return S_OK;
	}
	STDMETHOD(UnregisterComponent)(BSTR bstrCLSID)
	{
		CLSID clsid;
		CLSIDFromString(bstrCLSID, &clsid);
		_AtlComModule.UnregisterServer(FALSE, &clsid);
		return S_OK;
	}
};

OBJECT_ENTRY_AUTO(CLSID_CompReg, CCompReg)

⌨️ 快捷键说明

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