GSI

설정방법 :
1. MSXML 4.0을 설치한다.

2. VC++ 디렉토리  설정부분에서 include, lib를 설정해 준다.

3. MFC Dialog로 프로젝트 생성시 "자동화" 를 체크 해준다.
   3.1. 아마도 이런 코드가 더 추가되는거 같다. 다른 코드가 더 있는지는 잘 모르겠다.
// 이 매크로는 COleObjectFactory 생성자에 대한 bMultiInstance 매개 변수에 TRUE를
// 전달하는 점만 제외하면 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 파일에 아래의 코드를 추가한다.
#import <msxml4.dll>
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  이런 변수들을 그냥 사용하면 아래와 같은 내용의 에러가 나오게 된다.

d:\temp\ReadXML2\ReadXML2\ReadXML2Dlg.cpp(205) : error C2872: '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:: 를 붙여 주면 해결이 된다.

이상.
 

Posted by gsi
: