Erro: "0 x 80070057 (E_INVALIDARG - O parâmetro está incorreto)" mensagem de erro quando utiliza um ATL para capturar um evento quando um enum é usado como um parâmetro do evento

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 237771
Sintomas
Um coletor de eventos ATL definido com SINK_ENTRY ou SINK_ENTRY_EX falhará ao capturar um evento quando um enum é usado como um dos parâmetros para o evento. O código de falha retornado por IDispatch:: Invoke é "0 x 80070057 (E_INVALIDARG - O parâmetro está incorreto)." O evento terá êxito em outro recipiente, como Visual Basic.
Causa
GetFuncInfoFromID método do IDispEventImpl verifica o tipo de parâmetros de evento e, em encontrar tipo VT_USERDEFINED, chama GetUserDefinedType . Esse método verifica atualmente apenas para TKIND_ALIAS (tipos de dados "typedef estrutura") e não TKIND_ENUM .
Resolução
Há várias maneiras de contornar esse problema. Um método é usar a macro SINK_ENTRY_INFO e definir uma estrutura _ATL_FUNC_INFO para fornecer informações de tipo para o método de evento. Use um tipo VT_l4 para o parâmetro de enum . Para obter mais informações sobre SINK_ENTRY_INFO, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
194179AtlEvnt.exe exemplo mostra como criar ATL coletores usando as classes ATL IDispEventImpl e IDispEventSimpleImpl
Se você estiver usando IDispEventImpl <> para o coletor, você pode substituir a função virtual GetFuncInfoFromID . Uma substituição simples é da seguinte maneira.
HRESULT GetFuncInfoFromId(const IID& iid, DISPID dispidMember,LCID lcid, _ATL_FUNC_INFO& info){	// class base class implementation    HRESULT hr = IDispEventImpl<IDC_OBJ, CSinkObj, &DIID__IEnumEventEvents, &LIBID_TESTUNKARTICLELib, 1, 0>::GetFuncInfoFromId(iid, dispidMember,lcid, info);    if (SUCCEEDED(hr))	{        // is this the correct event interface        if (InlineIsEqualGUID(iid, DIID__IEnumEventEvents))		{            //check for dispid of event with enum param            switch(dispidMember)			{                case 1:                    // the enumeration parameter is change to VT_I4                    // info.pVarTypes represents the type of params                    // params are stored in reverse order, with 0 base index                    if (info.pVarTypes[0] == VT_USERDEFINED)                        info.pVarTypes[0] = VT_I4;                      break;			}		}	}    return hr;}				
mais direcionam abordagem ao usar IDispEventImpl <> é alterar a implementação de GetUserDefinedType Atlcom.h. Na linha 3968, após o bloco de código que começa "if(pta && pta->typekind == TKIND_ALIAS)", um segundoinstrução if pode ser inserida que definiria o VARTYPE correto para enumerações. Este bloco pôde ser gravado da seguinte maneira.
if (pta && pta->typekind == TKIND_ENUM){    vt = VT_I4;}				
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados na seção "Aplica-se a".Esse problema foi corrigido no Microsoft Visual C++. NET.
Referências
Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
194179AtlEvnt.exe exemplo mostra como cria ATL coletores usando as classes ATL IDispEventImpl e IDispEventSimpleImpl
181277O exemplo AtlSink.exe demonstra como implementar um recpetor de dispinterface, usando a ATL (Active Template Library) no Visual C++
Consulte também o artigos ATL na documentação do Visual C++, especificamente "ATL coleções e enumeradores" e "ATL evento Handling in."

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 237771 - Última Revisão: 09/01/2005 21:04:35 - Revisão: 3.0

Microsoft ActiveX Template Library 3.0

  • kbmt kberrmsg kbtshoot kbactivexevents kbautomation kbbug kbconnpts kbfix KB237771 KbMtpt
Comentários