私はすでに解決策を見つけているので、それは本当に質問ではありません。かなり時間がかかったので、ここで説明したいと思います。
Msxml は COM に基づいているため、メモリ割り当ての問題を処理するのに役立つクラスがある場合でも、C++ で使用するのは簡単ではありません。しかし、新しい XML パーサーを作成するのははるかに難しいため、msxml を使用したいと考えました。
問題:
( IXMLDOMNodeCComPtrごとに手動で Release() を呼び出さなくても済むようにするためのスマート ポインター)、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_tCComPtrを使用して間接的に置き換えます_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();
}