XML 설정방법과 오류 "'IXMLDOMProcessingInstructionPtr' : 모호한 기호입니다."
C++ 2007. 12. 6. 09:55 |1. MSXML 4.0을 설치한다.
2. VC++ 디렉토리 설정부분에서 include, lib를 설정해 준다.
3. MFC Dialog로 프로젝트 생성시 "자동화" 를 체크 해준다.
3.1. 아마도 이런 코드가 더 추가되는거 같다. 다른 코드가 더 있는지는 잘 모르겠다.
// 전달하는 점만 제외하면 IMPLEMENT_OLECREATE와 같습니다.
// 자동화 컨트롤러에서 요청한 각 자동화 프록시 개체에 대해 이 응용 프로그램에 대한 별도의 인스턴스가 시작되도록 합니다.
#ifndef IMPLEMENT_OLECREATE2
#define IMPLEMENT_OLECREATE2(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \
RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \
const AFX_DATADEF GUID class_name::guid = \
{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } };
#endif // IMPLEMENT_OLECREATE2
4. stdafx.h 파일에 아래의 코드를 추가한다.
using namespace MSXML2;
5. 테스트로 OK 버튼에 아래와 같은 내용을 추가 해서 테스트를 진행한다.
void CReadXML2Dlg::OnBnClickedOk()
{
MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
MSXML2::IXMLDOMProcessingInstructionPtr pPI; // XML ProcessingInstruction 선언
MSXML2::IXMLDOMElementPtr pRootElement; // XML Element 선언
MSXML2::IXMLDOMElementPtr pElement;
MSXML2::IXMLDOMTextPtr pText; // XML Text 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성
pPI=pDoc->createProcessingInstruction(L"xml",L"version=\"1.0\" encoding=\"euc-kr\""); // PI 생성
pRootElement=pDoc->createElement(L"IRC"); // Root element 생성
pElement=pDoc->createElement(L"Nick"); // "Nick" element 생성
pText=pDoc->createTextNode(L"wiluby"); // "wiluby" text element 생성
pDoc->appendChild(pPI); // ProcessingIsntruction 추가
pElement->appendChild(pText); // text element를 "Nick" element에 추가
pRootElement->appendChild(pElement); // "Nick" element를 root element에 추가
pDoc->appendChild(pRootElement); // Root element를 문서에 추가
AfxMessageBox(pDoc->xml); // XML 내용을 보자!!
//
OnOK();
}
그럼 아래와 같은 내용의 대화 상자가 나오게 된다.
그리고 제 환경이 그러서인지는 모르겠다. 2008을 깔고, .net 3.5를 다 깐 상태라서 MSXML 6.0이라는 폴더가 만들어져 있는 상태이다.
그래서 위의 코드 처름 스마트 포인터 형태의 IXMLDOMProcessingInstructionPtr 이런 변수들을 그냥 사용하면 아래와 같은 내용의 에러가 나오게 된다.
'c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\comdefsp.h(1261) : _com_ptr_t<_IIID> IXMLDOMProcessingInstructionPtr'일 수 있습니다.
with
[
_IIID=_com_IIID<IXMLDOMProcessingInstruction,& _GUID_2933bf89_7b36_11d2_b20e_00c04f983e60>
]
또는 'd:\temp\ReadXML2\ReadXML2\Debug\msxml4.tlh(298) : MSXML2::IXMLDOMProcessingInstructionPtr'일 수 있습니다.
아무래도 네임 스페이스 쪽의 충돌인지 선언이 안되어서 그런지는 잘 모르겠다.
하지만 위의 코드 처름 MSXML2:: 를 붙여 주면 해결이 된다.
이상.