PROBLEMA: Compilador erros quando você usar # Import com XML no Visual C++ .NET

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: 316317
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você usar bibliotecas de vínculo dinâmico analisador MSXML (DLLs), como MSXML.dll, Msxml2.dll, Msxml3.dll ou Msxml4.dll para compilar um projeto Visual C++.NET com # Import , você pode receber as seguintes mensagens de erro compilador:
c:\sample\test.cpp(12): erro C2872: 'IXMLDOMDocumentPtr': símbolo ambíguo

pode ser ' c:\Arquivos de Programas\Microsoft Visual Studio.NET\Vc7\include\comdefsp.h(1228): _com_ptr_t <_IIID> IXMLDOMDocumentPtr ' com [_IIID = _com_IIID < IXMLDOMDocument & _GUID_2933bf81_7b36_11d2_b20e_00c04f983e60 >]

ou ' c:\sample\Debug\msxml3.tlh(226): MSXML2::IXMLDOMDocumentPtr '
- ou -

c:\sample\test.cpp(16): erro C2039: 'async': não é um membro de 'IXMLDOMDocument' c:\Arquivos de Programas\Microsoft Visual Studio.NET\Vc7\PlatformSDK\Include\MsXml.h(1845): consulte a declaração do 'IXMLDOMDocument'
- ou -

c:\sample\test.cpp(27): erro C2660: 'IXMLDOMDocument::load': função não requer parâmetros 1
Você também pode ver outros erros C2039 e C2660 na saída. A solução descrita no seguinte artigo da Base de dados de Conhecimento não resolve os erros de compilador com o Microsoft Visual C++. NET:
269194PROBLEMA: Compilador erros quando você usar # Import com XML
Causa
O erro "símbolo ambíguo" ocorre quando uma definição de interface de ponteiro inteligente como IXMLDOMDocumentPtr é definida no namespace do MSXML2 (por meio de # Import ) e o espaço para nome global (por meio de Msxml.h), para que o símbolo ambíguo. Quando o compilador resolve as interfaces, o compilador procura primeiro no Msxml.h, que possui assinaturas diferentes daqueles que # Import gera.
Resolução
Para resolver esse problema, usa o namespace "typelib" com o analisador MSXML DLLs para prefixar os ponteiros de interface e exclusivo globalmente identificadores (GUIDs). Para evitar os erros, explicitamente qualificar a declaração de interface e GUIDs para remover a ambigüidade, da seguinte maneira:
#include <stdio.h>#import <msxml4.dll>void dump_com_error(_com_error &e);int main(int argc, char* argv[]) {	CoInitialize(NULL);	try 	{		MSXML2::IXMLDOMDocumentPtr pXMLDoc = NULL;		HRESULT hr = pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));		pXMLDoc->async =  VARIANT_FALSE; // default - true,		hr = pXMLDoc->loadXML("<tag1>Abcdef</tag1>");		//hr = pXMLDoc->load("myData.xml");				if (hr != VARIANT_TRUE)		{			MSXML2::IXMLDOMParseErrorPtr  pError;			pError = pXMLDoc->parseError;			_bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline()) + _bstr_t("\n")+ _bstr_t(pError->Getreason());			MessageBox(NULL,parseError, "Parse Error",MB_OK);			return 0;		}		else 		{			MessageBox(NULL,pXMLDoc->xml, "Loading Succeeded",MB_OK);		}	}	catch(_com_error &e) 	{		dump_com_error(e);	}	return 0;}void dump_com_error(_com_error &e){	printf("Error\n");	printf("\a\tCode = %08lx\n", e.Error());	printf("\a\tCode meaning = %s", e.ErrorMessage());	_bstr_t bstrSource(e.Source());	_bstr_t bstrDescription(e.Description());	printf("\a\tSource = %s\n", (LPCSTR) bstrSource);	printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);}				
Observação : MSXML.dll usa o namespace "MSXML". Msxml2.dll, Msxml3.dll e Msxml4.dll usam o namespace "MSXML2".
Situação
Esse comportamento é por design.
Mais Informações
A seguir está um exemplo de código típico que mostra o uso do analisador MSXML com o Visual C++:
#import "c:\winnt\system32\msxml4.dll" using namespace MSXML2;int main(int argc, char* argv[]){	IXMLDOMDocumentPtr dom(__uuidof(DOMDocument40));				
o recurso # Import inclui um arquivo chamado Comdef.h indiretamente inclui Urlmon.h, que por sua vez inclui Msxml.h. Isso é necessário porque o final do Comdef.h inclui Comdefsp.h, que define vários GUIDs e XML comuns interfaces. Por exemplo, o exemplo a seguir faz com que Msxml.h a serem incluídos antes do arquivo .TLH:
_COM_SMARTPTR_TYPEDEF(IXMLDocument, __uuidof(IXMLDocument));_COM_SMARTPTR_TYPEDEF(IXMLElement, __uuidof(IXMLElement));_COM_SMARTPTR_TYPEDEF(IXMLElementCollection, __uuidof(IXMLElementCollection));_COM_SMARTPTR_TYPEDEF(IXMLElementNotificationSink, __uuidof(IXMLElementNotificationSink));_COM_SMARTPTR_TYPEDEF(IXMLError, __uuidof(IXMLError));				
com o arquivo do MSXML 4.0 analisador, o arquivo Msxml4.tlh é gerado de # Import .

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 316317 - Última Revisão: 12/07/2015 08:41:05 - Revisão: 2.1

Microsoft XML Parser 2.0, Microsoft XML Parser 2.5, Microsoft XML Parser 2.6, Microsoft XML Parser 3.0, Microsoft XML Core Services 4.0, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft Visual C++ .NET 2003 Standard Edition

  • kbnosurvey kbarchive kbmt kbmsxmlnosweep kbprb KB316317 KbMtpt
Comentários