Registrando controles OLE
Os controles OLE, como outros objetos de servidor OLE, podem ser acessados por outros aplicativos com reconhecimento de OLE. Isso é obtido registrando a biblioteca de tipos e a classe do controle.
As seguintes funções permitem adicionar e remover a classe do controle, as páginas de propriedades e a biblioteca de tipos no banco de dados de registro do Windows:
Registrando controles OLE
Nome | Descrição |
---|---|
AfxOleRegisterControlClass | Adiciona a classe do controle ao banco de dados de registro. |
Classe AfxOleRegisterPropertyPageClass | Adiciona uma página de propriedades de controle ao banco de dados de registro. |
AfxOleRegisterTypeLib | Adiciona a biblioteca de tipos do controle ao banco de dados de registro. |
AfxOleUnregisterClass | Remove uma classe de controle ou uma classe de página de propriedades do banco de dados de registro. |
AfxOleUnregisterTypeLib | Remove a biblioteca de tipos do controle do banco de dados de registro. |
AfxOleRegisterTypeLib
normalmente é chamado na implementação de uma DLL de controle de DllRegisterServer
. Da mesma forma, AfxOleUnregisterTypeLib
é chamado por DllUnregisterServer
. AfxOleRegisterControlClass
, AfxOleRegisterPropertyPageClass
e AfxOleUnregisterClass
normalmente são chamados pela função de membro UpdateRegistry
de um alocador de classe ou página de propriedades de um controle.
AfxOleRegisterControlClass
Registra a classe de controle com o banco de dados de registro do Windows.
BOOL AFXAPI AfxOleRegisterControlClass(
HINSTANCE hInstance,
REFCLSID clsid,
LPCTSTR pszProgID,
UINT idTypeName,
UINT idBitmap,
int nRegFlags,
DWORD dwMiscStatus,
REFGUID tlid,
WORD wVerMajor,
WORD wVerMinor);
Parâmetros
hInstance
O identificador de instância do módulo associado à classe de controle.
clsid
O ID de classe exclusiva do controle.
pszProgID
A ID de programa exclusiva do controle.
idTypeName
A ID do recurso da cadeia de caracteres que contém um nome de tipo legível pelo usuário para o controle.
idBitmap
A ID do recurso do bitmap usado para representar o controle OLE em uma barra de ferramentas ou paleta.
nRegFlags
Contém um ou mais dos seguintes sinalizadores:
afxRegInsertable
Permite que o controle apareça na caixa de diálogo Inserir Objeto para objetos OLE.afxRegApartmentThreading
Define o modelo de threading no Registro como ThreadingModel=Apartment.afxRegFreeThreading
Define o modelo de threading no Registro como ThreadingModel=Free.Você pode combinar os dois sinalizadores
afxRegApartmentThreading
eafxRegFreeThreading
para definir ThreadingModel=Both. Confira InprocServer32 no SDK do Windows para mais informações sobre o registro de modelo de threading.
Observação
Nas versões do MFC anteriores ao MFC 4.2, o int
parâmetro nRegFlags era um parâmetro BOOL, bInsertable, que permitia ou não que o controle fosse inserido na caixa de diálogo Inserir Objeto.
dwMiscStatus
Contém um ou mais dos seguintes sinalizadores de status (para uma descrição dos sinalizadores, confira a enumeração OLEMISC no SDK do Windows):
OLEMISC_RECOMPOSEONRESIZE
OLEMISC_ONLYICONIC
OLEMISC_INSERTNOTREPLACE
OLEMISC_STATIC
OLEMISC_CANTLINKINSIDE
OLEMISC_CANLINKBYOLE1
OLEMISC_ISLINKOBJECT
OLEMISC_INSIDEOUT
OLEMISC_ACTIVATEWHENVISIBLE
OLEMISC_RENDERINGISDEVICEINDEPENDENT
OLEMISC_INVISIBLEATRUNTIME
OLEMISC_ALWAYSRUN
OLEMISC_ACTSLIKEBUTTON
OLEMISC_ACTSLIKELABEL
OLEMISC_NOUIACTIVATE
OLEMISC_ALIGNABLE
OLEMISC_IMEMODE
OLEMISC_SIMPLEFRAME
OLEMISC_SETCLIENTSITEFIRST
tlid
A ID exclusiva da classe de controle.
wVerMajor
O número de versão principal da classe de controle.
wVerMinor
O número de versão secundária da classe de controle.
Valor de retorno
Não zero se a classe de controle foi registrada; caso contrário, 0.
Comentários
Isso permite que o controle seja usado por contêineres com reconhecimento de controle OLE. AfxOleRegisterControlClass
atualiza o Registro com o nome e o local do controle no sistema e também define o modelo de threading a que o controle dá suporte no Registro. Para mais informações, confira Nota Técnica 64, "Threading apartment-model em controles OLE" e Sobre processos e threads no SDK do Windows.
Exemplo
// Member function implementation of class COleObjectFactory::UpdateRegistry
//
BOOL CMyAxCtrl::CMyAxCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_NVC_MFCAXCTL,
IDB_NVC_MFCAXCTL,
afxRegInsertable | afxRegApartmentThreading,
_dwMyOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
O exemplo acima demonstra como AfxOleRegisterControlClass
é chamado com o sinalizador para inserção e o sinalizador para o modelo de apartament ORed juntos para criar o sexto parâmetro:
afxRegInsertable | afxRegApartmentThreading,
O controle será exibido na caixa de diálogo Inserir Objeto para contêineres habilitados e terá reconhecimento de modelo de apartament. Os controles com reconhecimento de modelo de apartament devem garantir que os dados de classe estáticos sejam protegidos por bloqueios, de modo que, enquanto um controle em um apartament estiver acessando os dados estáticos, ele não seja desabilitado pelo agendador antes de ser concluído e outra instância da mesma classe comece a usar os mesmos dados estáticos. Todos os acessos aos dados estáticos ficarão entre código de seção crítico.
Requisitos
Cabeçalho afxctl.h
Classe AfxOleRegisterPropertyPageClass
Registra a classe de página de propriedades com o banco de dados de Registro do Windows.
BOOL AFXAPI AfxOleRegisterPropertyPageClass(
HINSTANCE hInstance,
REFCLSID clsid,
UINT idTypeName,
int nRegFlags);
Parâmetros
hInstance
O identificador de instância do módulo associado à classe da página de propriedades.
clsid
A ID de classe exclusiva da página de propriedades.
idTypeName
A ID do recurso da cadeia de caracteres que contém um nome legível pelo usuário para a página de propriedades.
nRegFlags
Pode conter o sinalizador:
afxRegApartmentThreading
Define o modelo de threading no Registro como ThreadingModel = Apartment.
Observação
Nas versões do MFC anteriores ao MFC 4.2, o int
parâmetro nRegFlags não estava disponível. Observe também que o sinalizador afxRegInsertable
não é uma opção válida para páginas de propriedade e causará um ASSERT no MFC se ele estiver definido
Valor de retorno
Não zero se a classe de controle foi registrada; caso contrário, 0.
Comentários
Isso permite que a página de propriedades seja usada por contêineres que estejam cientes do controle OLE. AfxOleRegisterPropertyPageClass
atualiza o Registro com o nome da página de propriedades e seu local no sistema e também define o modelo de threading compatível com o controle no Registro. Para mais informações, confira Nota Técnica 64, "Threading apartment-model em controles OLE" e Sobre processos e threads no SDK do Windows.
Requisitos
Cabeçalho afxctl.h
AfxOleRegisterTypeLib
Registra a biblioteca de tipos com o banco de dados de registro do Windows e permite que a biblioteca de tipos seja usada por outros contêineres que estejam cientes do controle OLE.
BOOL AfxOleRegisterTypeLib(
HINSTANCE hInstance,
REFGUID tlid,
LPCTSTR pszFileName = NULL,
LPCTSTR pszHelpDir = NULL);
Parâmetros
hInstance
O identificador de instância do aplicativo associado à biblioteca de tipos.
tlid
A ID exclusiva da biblioteca de tipos.
pszFileName
Aponta para o nome de arquivo opcional de um arquivo (.TLB) de biblioteca de tipos localizada para o controle.
pszHelpDir
O nome do diretório em que o arquivo de ajuda para a biblioteca de tipos pode ser encontrado. Se NULL, o arquivo de ajuda será considerado no mesmo diretório que a própria biblioteca de tipos.
Valor de retorno
Não zero se a biblioteca de tipos foi registrada; caso contrário, 0.
Comentários
Essa função atualiza o Registro com o nome da biblioteca de tipos e sua localização no sistema.
Exemplo
// Type library guid definition.
const GUID CDECL BASED_CODE _tlid =
{ 0x77E58ED8, 0xA2C0, 0x4C13, { 0xB6, 0xC1, 0xBA, 0xD1, 0x19, 0xAF, 0xE3, 0xF1 } };
// Registers type library and the interfaces
// in it, afxctl.h needs to be included
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
// CMFCAutomation.tlb should be in the same directory as exe module.
// last param can be null if help file associated w/ tlb is in same dir as .tlb
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid,
_T("CMFCAutomation.tlb"), NULL))
{
return ResultFromScode(SELFREG_E_TYPELIB);
}
Requisitos
Cabeçalho: afxdisp.h
AfxOleUnregisterClass
Remove a entrada de classe de página de propriedades ou controle do banco de dados de registro do Windows.
BOOL AFXAPI AfxOleUnregisterClass(REFCLSID clsID, LPCSTR pszProgID);
Parâmetros
clsID
A ID de classe exclusiva da página de propriedades ou controle.
pszProgID
A ID de programa exclusiva da página de propriedades ou controle.
Valor de retorno
Não zero se a classe de página de propriedades ou controle tiver sido não registrada com êxito; caso contrário, 0.
Requisitos
Cabeçalho afxctl.h
AfxOleUnregisterTypeLib
Chame essa função para remover a entrada da biblioteca de tipos do banco de dados de registro do Windows.
BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlID);
Parâmetros
tlID
A ID exclusiva da biblioteca de tipos.
Valor de retorno
Não zero se o registro da biblioteca de tipos tiver sido cancelado com êxito; caso contrário, 0.
Exemplo
// Type library GUID, corresponds to the uuid attribute of the library
// section in the .odl file.
const GUID CDECL BASED_CODE _tlid =
{0xA44774E8, 0xAE00, 0x451F, {0x96, 0x1D, 0xC7, 0xD2, 0xD2, 0x58, 0xA0, 0x75}};
// Type library major version number, number on the left of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMajor = 1;
// Type library minor version number, number on the right of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMinor = 0;
STDAPI DllUnregisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
Requisitos
Cabeçalho: afxdisp.h