Gerçekten bir soru değil çünkü zaten bir çözüm buldum. Çok zaman aldı, bu yüzden burada açıklamak istiyorum.Visual Studio 2008 Express ile (hiç ATL sınıfı yok) msxml, deli olmadan nasıl kullanılır?
Msxml, COM'a dayanmaktadır, bu nedenle bellek ayırma sorunları ile başa çıkmak için yararlı sınıflara sahip olsanız bile C++'da kullanımı gerçekten kolay değildir. Ancak yeni bir XML ayrıştırıcısını yazmak çok daha zor olurdu, bu yüzden msxml kullanmak istedim.
sorun:
Ben CComBSTR
(el her ıxmldomnode Tahliyesine() aramak zorunda kalmamak için akıllı pointer) CComPtr
yardımıyla Msxml kullanmak internette yeterince örnekler bulmak mümkün oldu (C++ dizelerini dizeler için COM biçimine dönüştürmek için) ve CComVariant
. Bu 3 yararlı sınıf ATL sınıflarıdır ve bir #include <atlbase.h>
'a ihtiyaç duyar.
Sorun: Visual Studio 2008 Express (ücretsiz sürüm) ATL'yi içermiyor.
Çözüm: Bazı basit yardımcı sınıflar dahil
Kullanım comutil.h
ve comdef.h
:
_bstr_t
değiştirir az ya da çokCComBSTR
_variant_t
değiştirir az ya da çokCComVariant
_com_ptr_t
cümledeki dolaylı olarak
Küçük örnek kullanımı yoluyla: zaten such as eXpat yapılır başka bir XML ayrıştırıcı kullanmak istiyorum
#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'yi içermiyor mu? Bu berbat. > :( –