Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Microsoft Visual C++ .NET (2002) e Microsoft Visual C++ .NET (2003) suportam o modelo de código gerido que é fornecido pelo .NET Framework e o modelo de código Windows nativo não gerido. As informações neste artigo aplicam-se para o código de Visual C++ não gerido apenas.
AtlEvnt.exe mostra como implementar um receptor de eventos utilizando as classes ATL IDispEventImpl e IDispEventSimpleImpl. Para controlos compostos ou caixas de diálogo ATL, o assistente insere IDispEventImpl a lista de herança para configurar o receptor. Por isso, o foco deste exemplo consiste em criar pias para outros tipos de objectos COM e clientes. Só é aplicável às interfaces de origem do tipo dispinterface.
Utilize IDispEventImpl quando tiver acesso a uma biblioteca de tipos. Utilize IDispEventSimpleImpl quando não tem acesso à biblioteca de tipos ou quando pretende que seja mais eficiente por não carregar a biblioteca de tipos.
Para além de uma hiperligação para o exemplo, a secção mais informação deste artigo inclui uma descrição geral das informações sobre como implementar cada classe e de projecto.
Os ficheiros seguintes estão disponíveis para transferência a partir do Centro de transferências da Microsoft:
Visual C++ 6.0
Reduzir esta imagemExpandir esta imagem
Download Atlevnt.exe now
(http://download.microsoft.com/download/vc60pro/sample7/1/win98/en-us/atlevnt.exe)
Para obter mais informações sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591
(http://support.microsoft.com/kb/119591/
)
Como obter ficheiros de suporte da Microsoft a partir de serviços online
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada o que ajuda a impedir alterações não autorizadas ao ficheiro.
Visual C++ .NET
Reduzir esta imagemExpandir esta imagem
Download Atlevntvcnet.exe now
(http://download.microsoft.com/download/visualstudionet/sample/1.11/win98mexp/en-us/atlevntvcnet.exe)
Data de edição: 25 de Junho de 2002
Para obter mais informações sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591
(http://support.microsoft.com/kb/119591/
)
Como obter ficheiros de suporte da Microsoft a partir de serviços online
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada o que ajuda a impedir alterações não autorizadas ao ficheiro. A área de trabalho ATLEVNT consiste em dois projectos, AtlEvnt e EventSrc. Utilize a opção -d quando executar AtlEvnt.exe:
A área de trabalho AtlEvnt consiste em dois projectos, AtlEvnt e EventSrc.
O projecto EventSrc é uma predefinição Projecto ATL DLL com um Simple "objecto". O objecto simples não tem métodos e foi modificado para suportar a interface IPersist e pontos de ligação. O objecto COM expõe uma origem interface predefinida (abaixo) que tem um único método chamado das marcas de escala. O COM objecto chama este método em todos os objectos de receptor ligados a ele, com base num temporizador:
AltEvnt O projecto for um projecto ATL EXE. Uma classe ATL CDialogImpl foi adicionada ao transformar o projecto uma aplicação de diálogo simples. Quatro PIAs foram adicionadas ao projecto (duas utilizando IDispEventImpl e dois utilizando IDispEventSimpleImpl). Cada receptor ilustra uma forma diferente de fornecer um objecto de receptor para processar o evento das marcas de escala accionado pelo objecto EventSrc COM.
A caixa de diálogo tem quatro botões e clicar num botão permite ligar o receptor correspondente de objectos COM EventSrc. A caixa de listagem apresenta uma cadeia de formulário "Sinkn: marca eventos recebidos - x" escala é designado por processador de eventos no receptor de cada vez. Uma vez estabelecida uma ligação, o botão está desactivado. Se existir qualquer problema estabelecer a ligação o texto do botão é substituído por uma cadeia de formato "Ligar Err-hr" onde "hr" representa a falha HRESULT. Utilize a ferramenta "Erro de pesquisa" que é fornecido com o Visual C++, versão 6.0 para obter uma explicação sobre o erro.
Para executar este exemplo, primeiro criar o projecto EventSrc e certifique-se que o objecto EventSrc está registado com êxito. Em seguida, criar o projecto AtlEvnt e executá-la. São apresentadas uma caixa de diálogo com quatro botões (separadamente de OK e cancelar) e uma caixa de listagem. Os quatro botões representam quatro receptores. Clicar num botão liga o receptor à origem. Depois de estabelecida a ligação, cadeias são adicionadas à caixa de listagem sempre denomina-se uma rotina de tratamento.
Crie uma nova classe derivada de IDispEventImpl. Pode clicar em Nova classe no menu Inserir para gerar uma nova classe. Para cada receptor diferente, adicione uma classe IDispEventImpl à lista de herança com um ID exclusivo como o primeiro parâmetro. A classe receptor pode ser um objecto COM (como num controlo composto) ou uma classe que deriva apenas IdispEventImpl:
// Just a sink.
class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj>
{
...
}
- ou -
// COM object that also implements a sink (as in a composite
// control).
class ATL_NO_VTABLE CSinkObj :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSinkObj, &CLSID_SinkObj>,
public IDispatchImpl<ISinkObj, &IID_ISinkObj, &LIBID_SINKPROJLib>,
public IDispEventImpl<IDC_SRCOBJ, CSinkObj>
{
...
}
Pode especificar o ID de interface de origem, o ID da biblioteca de tipo, números de versão principal e secundária da biblioteca de tipo que contém a interface de origem explicitamente como parâmetros de IdispEventImpl ou utilizar o AtlGetObjectSourceInterface() para extrair estas informações de biblioteca de tipos. Utilização AtlGetObjectSourceInterface() requer que o objecto COM accionar o evento implementar IProvideClassInfo2 ou IPersist *:
class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj>
{
...
}
- ou -
class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj,
&DIID__EventSink, // Source interface GUID.
&LIBID_COMOBJLib, // typelib ID containing source interface.
1, // Major version # of LIBID_COMOBJLib.
0> // Minor version # of LIBID_COMOBJLib.
{
...
}
Adicione um mapa de receptor de classe acima e uma entrada de receptor correspondente a cada evento de uma interface de origem que pretende processar. Utilizar SINK_ENTRY_EX() quando a interface de origem especificada como um parâmetro no IDispEventImpl, caso contrário, utilize SINK_ENTRY():
class CSinkObj : public IDispEventImpl<IDC_SRCOBJ, CSinkObj>
{
public:
BEGIN_SINK_MAP(CSinkObj)
SINK_ENTRY(IDC_SRCOBJ, 1 /*DISPID*/, OnTick /*Event Handler*/)
END_SINK_MAP()
...
}
- ou -
class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj,
&DIID__EventSink, &LIBID_COMOBJLib, 1, 0>
{
public:
BEGIN_SINK_MAP(CSinkObj)
SINK_ENTRY_EX(IDC_SRCOBJ, DIID__EventSink, 1, OnTick)
END_SINK_MAP()
...
}
Adicione métodos de rotina de tratamento de eventos à classe. Certifique-se que tem __stdcall convenção de chamada:
class CSinkObj : public IDispEventImpl<IDC_SRCOBJ, CSinkObj3>
{
public:
BEGIN_SINK_MAP(CSinkObj)
SINK_ENTRY(IDC_SRCOBJ, 1 , OnTick)
END_SINK_MAP()
// event handler for event defined in idl as
// [id(1)] HRESULT Tick([in] long tckcnt);
HRESULT __stdcall OnTick(long tickcnt)
{
ATLTRACE("CSinkObj::OnTick\n");
return S_OK;
}
...
}
Ligar o receptor ao objecto COM por DispEventAdvise() chamada. Se a interface de origem é especificada como um parâmetro para IDispEventImpl, em seguida, ligue para:
// pUnk is the IUnknown pointer of the COM object that fires events.
// pSinkObj is an instance of the CSinkObj class.
pSinkObj->DispEventAdvise(pUnk);
ou outra chamada:
// Make sure the COM object corresponding to pUnk implements
// IProvideClassInfo2 or IPersist*.
// Call this method to extract info about source type library if you
// specified only two parameters to IdispEventImpl.
AtlGetObjectSourceInterface(pUnk, &pSinkObj->m_libid,
&pSinkObj->m_iid, &pSinkObj->m_wMajorVerNum,
&pSinkObj->m_wMinorVerNum);
hr = pSinkObj->DispEventAdvise(pUnk, &pSinkObj->m_iid);
Crie uma classe derivada de IDispEventSimpleImpl. A interface de origem tem de ser especificado.
Siga o passo 3 acima excepto adicionar SINK_ENTRY_INFO() para cada método de uma interface de origem que pretende processar. Uma vez que IDispEventSimpleImpl não tem acesso à biblioteca de tipos tem de fornecer informações sobre cada processador de eventos através de uma estrutura _ATL_FUNC_INFO, uma para cada processador de eventos.
Em vez de especificar uma estrutura _ATL_FUNC_INFO em SINK_ENTRY_INFO(), pode utilizar o SINK_ENTRY_EX() macros e substituir a função virtual GetFuncInfoFromId() para preencher o _ATL_FUNC_INFO estruturar, como mostrado no seguinte código.
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 194179
(http://support.microsoft.com/kb/194179/en-us/
)
Qual foi o esforço que despendeu pessoalmente para utilizar este artigo?
Muito baixo
Baixo
Moderado
Elevado
Muito elevado
Diga-nos porquê e o que podemos fazer para melhorar estas informações
Obrigado! Os seus comentários são utilizados para ajudar-nos a melhorar o conteúdo do nosso suporte. Para obter mais opções de assistência, visite a Home Page de Ajuda e Suporte.