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