본문 바로가기

Application Programming Interface/Windows API

Visual C++로 MSXML 사용하기 #4

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

BSTR과 마찬가지로 VARIANT형도 자신이 싣게될 데이터형에 따라 알아서 처리하는 _variant_t 클래스를 제공합니다. V_VT와 V_자료형 매크로를 사용해 일일이 데이터형을 지정하지 않아도 된다는 뜻입니다. 3편에서 보였던 소스를 _variant_t 형으로 다시 작성해보겠습니다.

/* ex08.cpp */
#include "stdafx.h"

int main(int argc, char * argv[])
{
	::setlocale(LC_ALL, "");

	if (SUCCEEDED(::CoInitialize(NULL)))
	{
		{
			_bstr_t bstr1, bstr2, bstr3;
			_variant_t variant;
			IXMLDOMDocumentPtr xmlDocument;
			IXMLDOMProcessingInstructionPtr xmlProcessingInstruction;
			IXMLDOMElementPtr xmlElement;
			IXMLDOMAttributePtr xmlAttribute;

			if (!SUCCEEDED(xmlDocument.CreateInstance(__uuidof(DOMDocument))))
			{
				::wprintf(L"xmlDocument가 생성되지 않았습니다.\n");
				::CoUninitialize();
				return -1;
			}

			bstr1 = TEXT("xml");
			bstr2 = TEXT("version=\"1.0\"");
			xmlDocument->createProcessingInstruction(bstr1, bstr2, &xmlProcessingInstruction);

			xmlDocument->appendChild(xmlProcessingInstruction, NULL);

			bstr1 = TEXT("document");
			xmlDocument->createElement(bstr1, &xmlElement);

			bstr1 = TEXT("name");
			bstr2 = TEXT("tapito.tistory.com");
			variant = bstr2;
			xmlDocument->createAttribute(bstr1, &xmlAttribute);
			xmlAttribute->put_value(variant);
			xmlElement->setAttributeNode(xmlAttribute, NULL);

			bstr1 = TEXT("number");
			variant = (int)1000;
			xmlDocument->createAttribute(bstr1, &xmlAttribute);
			xmlAttribute->put_value(variant);
			xmlElement->setAttributeNode(xmlAttribute, NULL);

			bstr1 = TEXT("average");
			variant = 3.14159f;
			xmlDocument->createAttribute(bstr1, &xmlAttribute);
			xmlAttribute->put_value(variant);
			xmlElement->setAttributeNode(xmlAttribute, NULL);

			xmlDocument->appendChild(xmlElement, NULL);

			xmlDocument->get_xml(bstr3.GetAddress());
			::wprintf(L"%s", (const wchar_t *)bstr3);
		}
		::CoUninitialize();
	}
	return 0;
}

다시 설명하면

VARIANT variant;
V_VT(&variant) = VT_BSTR;
V_BSTR(&variant) = bstr2;

이랬던 부분이

_variant_t variant;
variant = bstr2;

이와 같이 단순화 되었다는 뜻입니다. 자료형을 판별하는 등의 작업은 클래스 내부에서 알아서 이뤄지는 것이죠