這不是一個真正的問題,因爲我已經找到了解決方案。這花了我很多時間,這就是爲什麼我想在這裏解釋它。如何在沒有變得瘋狂的情況下將Visual Studio 2008 Express(無ATL類)使用msxml?
Msxml基於COM,因此即使在您有用於處理內存分配問題的有用類時,在C++中使用也不是很容易。但是編寫一個新的XML解析器會困難得多,所以我想使用msxml。
問題:
我能在互聯網上找到足夠的例子使用MSXML與CComPtr
的幫助(智能指針,以避免手動調用Release()對每個IXMLDOMNode),CComBSTR
(將C++字符串轉換爲字符串的COM格式)和CComVariant
。這3個有用的課程是ATL課程,需要#include <atlbase.h>
。
問題:Visual Studio 2008 Express(免費版)不包括ATL。
解決方案:
使用comutil.h
和comdef.h
,其中包括一些簡單的輔助類:
_bstr_t
取代或多或少CComBSTR
_variant_t
取代或多或少CComVariant
_com_ptr_t
內容替換間接地CComPtr
通過使用_COM_SMARTPTR_TYPEDEF
小例子:
#include <msxml.h>
#include <comdef.h>
#include <comutil.h>
// Define some smart pointers for MSXML
_COM_SMARTPTR_TYPEDEF(IXMLDOMDocument, __uuidof(IXMLDOMDocument)); // IXMLDOMDocumentPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMElement, __uuidof(IXMLDOMElement)); // IXMLDOMElementPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNodeList, __uuidof(IXMLDOMNodeList)); // IXMLDOMNodeListPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNamedNodeMap, __uuidof(IXMLDOMNamedNodeMap)); // IXMLDOMNamedNodeMapPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNode, __uuidof(IXMLDOMNode)); // IXMLDOMNodePtr
void test_msxml()
{
// This program will use COM
CoInitializeEx(NULL, COINIT_MULTITHREADED);
{
// Create parser
IXMLDOMDocumentPtr pXMLDoc;
HRESULT hr = CoCreateInstance(__uuidof (DOMDocument), NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pXMLDoc);
pXMLDoc->put_validateOnParse(VARIANT_FALSE);
pXMLDoc->put_resolveExternals(VARIANT_FALSE);
pXMLDoc->put_preserveWhiteSpace(VARIANT_FALSE);
// Open file
VARIANT_BOOL bLoadOk;
std::wstring sfilename = L"testfile.xml";
hr = pXMLDoc->load(_variant_t(sfilename.c_str()), &bLoadOk);
// Search for node <testtag>
IXMLDOMNodePtr pNode;
hr = pXMLDoc->selectSingleNode(_bstr_t(L"testtag"), &pNode);
// Read something
_bstr_t bstrText;
hr = pNode->get_text(bstrText.GetAddress());
std::string sSomething = bstrText;
}
// I'm finished with COM
// (Don't call before all IXMLDOMNodePtr are out of scope)
CoUninitialize();
}
VS2008 express不包括ATL?這很糟糕。 > :( – 2009-01-21 22:39:54