Как юзать MSXML в MFC?
От: KrikZ Россия krikZ.narod.ru
Дата: 29.03.06 10:36
Оценка:
Создаю MFC Application
добавляю класс при помощи MFC Class TypeLib
выбираю MSXML Любой версии, создаю нужные классы, создаю экземпляры, в VS2005 компилятор находит 306 ошибок, в VS2003 нормально компилирует, но XMLDOMDocument не загружает документы.

29.03.06 15:09: Перенесено модератором из 'C/C++' — Кодт
Re: Как юзать MSXML в MFC?
От: orefkov  
Дата: 31.03.06 06:51
Оценка:
Здравствуйте, KrikZ, Вы писали:

KZ>Создаю MFC Application

KZ>добавляю класс при помощи MFC Class TypeLib
KZ>выбираю MSXML Любой версии, создаю нужные классы, создаю экземпляры, в VS2005 компилятор находит 306 ошибок, в VS2003 нормально компилирует, но XMLDOMDocument не загружает документы.

Используй #import, гораздо кучерявее
Re[2]: Как юзать MSXML в MFC?
От: KrikZ Россия krikZ.narod.ru
Дата: 31.03.06 11:27
Оценка: :)
Исправлено форматирование текста. — SchweinDeBurg

Здравствуйте, orefkov, Вы писали:

O>Используй #import, гораздо кучерявее


в мсдн-е дот нет-а нешел кое что:

#include <stdio.h>
#include <windows.h>
#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;

// Macro that calls a COM method returning HRESULT value:
#define HRCALL(a, errmsg) \
do { \
    hr = (a); \
    if (FAILED(hr)) { \
        dprintf( "%s:%d  HRCALL Failed: %s\n  0x%.8x = %s\n", \
                __FILE__, __LINE__, errmsg, hr, #a ); \
        goto clean; \
    } \
} while (0)

// Helper function that put output in stdout and debug window
// in Visual Studio:
void dprintf( char * format, ...)
{
    static char buf[1024];
    va_list args;
    va_start( args, format );
    vsprintf( buf, format, args );
    va_end( args);
    OutputDebugStringA( buf);
    printf("%s", buf);
}

// Helper function to create a DOM instance:
IXMLDOMDocument * DomFromCOM()
{
   HRESULT hr;
   IXMLDOMDocument *pxmldoc = NULL;

    HRCALL( CoCreateInstance(__uuidof(DOMDocument40),
                      NULL,
                      CLSCTX_INPROC_SERVER,
                      __uuidof(IXMLDOMDocument),
                      (void**)&pxmldoc),
            "Create a new DOMDocument");

    HRCALL( pxmldoc->put_async(VARIANT_FALSE),
            "should never fail");
    HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE),
            "should never fail");
    HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE),
            "should never fail");

   return pxmldoc;
clean:
   if (pxmldoc)
    {
      pxmldoc->Release();
    }
   return NULL;
}


int main(int argc, char* argv[])
{
   IXMLDOMDocument *pXMLDom=NULL;
   IXMLDOMParseError *pXMLErr=NULL;
   BSTR bstr = NULL;
   VARIANT_BOOL status;
   VARIANT var;
   HRESULT hr;

   CoInitialize(NULL);

   pXMLDom = DomFromCOM();
   if (!pXMLDom) goto clean;

   VariantInit(&var);
   V_BSTR(&var) = SysAllocString(L"stocks.xml");
   V_VT(&var) = VT_BSTR;
   HRCALL(pXMLDom->load(var, &status), "");

   if (status!=VARIANT_TRUE) {
      HRCALL(pXMLDom->get_parseError(&pXMLErr),"");
      HRCALL(pXMLErr->get_reason(&bstr),"");
      dprintf("Failed to load DOM from stocks.xml. %S\n",
               bstr);
      goto clean;
   }
   HRCALL(pXMLDom->get_xml(&bstr), "");
   dprintf("XML DOM loaded from stocks.xml:\n%S\n",bstr);

clean:
   if (bstr) SysFreeString(bstr);
   if (&var) VariantClear(&var);
   if (pXMLErr) pXMLErr->Release();
   if (pXMLDom) pXMLDom->Release();

   CoUninitialize();
   return 0;
}

ща буду переваривать!!!
Re: Как юзать MSXML в MFC?
От: algol Россия about:blank
Дата: 31.03.06 11:52
Оценка:
Здравствуйте, KrikZ, Вы писали:

KZ>выбираю MSXML Любой версии, создаю нужные классы, создаю экземпляры, в VS2005 компилятор находит 306 ошибок, в VS2003 нормально компилирует, но XMLDOMDocument не загружает документы.


Q316317
Re[3]: Как юзать MSXML в MFC?
От: kan_izh Великобритания  
Дата: 31.03.06 16:36
Оценка:
KrikZ wrote:

> O>Используй #import, гораздо кучерявее

>
> в мсдн-е дот нет-а нешел кое что:
>
> #include <stdio.h>
> #include <windows.h>
> #import <msxml4.dll> raw_interfaces_only

Блин, MSDN как всегда жжот. Как будто специально фигню такую пишут.

Пиши так:
#include "stdafx.h"
#include <iostream>
#include <cassert>
#import <msxml4.dll> named_guids

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    MSXML2::IXMLDOMDocumentPtr doc(MSXML2::CLSID_DOMDocument40);
    assert(doc != NULL);
    doc->async = false;
    doc->validateOnParse = false;
    doc->resolveExternals = false;

    if(!doc->load(_T("C:\\temp\\test\\test2.xul")))
    {
        MSXML2::IXMLDOMParseErrorPtr err = doc->parseError;
        std::cout << err->errorCode << " at "
            << err->filepos << ":" << err->linepos << " "
            << err->reason << std::endl;
    }
    else
    {
        std::cout << doc->xml << std::endl;
    }
    return 0;
}

Желательно #import перенести в stdafx.h файл. И не забывай расставлять try-catch(_com_error &) блоки.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.