Re[13]: Изменения в MFC 7.0/7.1
От: tyomchick Россия  
Дата: 03.06.03 09:25
Оценка:
Здравствуйте, Serguei666, Вы писали:

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



T>>А выход как из 3-4-ох вложенных циклов как делать. Самый шик конечно исключение бросить .

S>Самое простое и надежное — флажок выставить.

А примерчик в студию можно для 4ох циклов?

И попробуйте переделать вот такой код из MSDN, ну хотя бы на словах.


#define UNICODE

#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <urlmon.h>
#include <hlink.h>
#include <dispex.h>
#include "mshtml.h"
#include "msxml.h"

#define ASSERT(x)  if(!(x)) DebugBreak()
#define CHECK_ERROR(cond, err) if (!(cond)) {pszErr=(err); goto done;}
#define SAFERELEASE(p) if (p) {(p)->Release(); p = NULL;} else ;


int _cdecl main (int argc, char **argv)
{
    PSTR pszErr = NULL;
    IXMLDocument           *pDoc = NULL;
    IStream                *pStm = NULL;
    IPersistStreamInit     *pPSI = NULL;
    CHAR                   buf[MAX_PATH];
    CHAR                   *pszURL;

    HRESULT hr;

    //
    // Check usage.
    //
    if (argc != 2)
    {
        fprintf (stderr, "Usage:   %s URL\n", argv[0]);
        fprintf (stderr, "Eg %s c:\\nt\\private\\inet\\xml\\test\\channel.cdf\n", argv[0]);
        fprintf (stderr, "or %s http://ohserv/users/julianj/msnbc.cdf\n", argv[0]);
        exit (1);
    }

    //
    // HACK if passed in a file name; expand if it doesn't look like a URL.
    //
    if (CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, argv[1], 7, "http://", 7) == CSTR_EQUAL)
    {
        pszURL = argv[1];
    }
    else
    {
        pszURL = buf;
        GetFullPathNameA(argv[1], MAX_PATH, pszURL, NULL);
    }

    hr = CoInitialize(NULL);
    ASSERT(SUCCEEDED(hr));

    //
    // Create an empty XML document.
    //
    hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
                                IID_IXMLDocument, (void**)&pDoc);

    CHECK_ERROR (pDoc, "CoCreateInstance Failed");

    //
    // Synchronously create a stream on a URL.
    //
    hr = URLOpenBlockingStreamA(0, pszURL, &pStm, 0,0);    
    CHECK_ERROR(SUCCEEDED(hr) && pStm, "Couldn't open stream on URL")
    //
    // Get the IPersistStreamInit interface to the XML doc.
    //
    hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI);
    CHECK_ERROR(SUCCEEDED(hr), "QI for IPersistStreamInit failed");

    //
    // Init the XML doc from the stream.
    //
    hr = pPSI->Load(pStm);
    //CHECK_ERROR(SUCCEEDED(hr), "Couldn't load XML doc from stream");

    if(SUCCEEDED(hr))
    {
        printf("%s : XML File is well formed \r\n",argv[0]);

    }
    else
    {
        // Print error information !
        IXMLError *pXMLError = NULL ;
        XML_ERROR xmle;

        hr = pPSI->QueryInterface(IID_IXMLError, (void **)&pXMLError);
        CHECK_ERROR(SUCCEEDED(hr), "Couldn't get IXMLError");

        ASSERT(pXMLError);

        hr = pXMLError->GetErrorInfo(&xmle);
        SAFERELEASE(pXMLError);
        CHECK_ERROR(SUCCEEDED(hr), "GetErrorInfo Failed");

        printf("%s :", argv[0]);
        wprintf(TEXT(" Error on line %d. Found %s while expecting %s\r\n"),
                            xmle._nLine,
                            xmle._pszFound,
                            xmle._pszExpected); 
        
        SysFreeString(xmle._pszFound);
        SysFreeString(xmle._pszExpected);
        SysFreeString(xmle._pchBuf);
    }

done: // Clean up.
    //
    // Release any used interfaces.
    //
    SAFERELEASE(pPSI);
    SAFERELEASE(pStm);
    SAFERELEASE(pDoc);

    if (pszErr)
        fprintf (stderr, "%s, last error %d\n", pszErr, GetLastError());
    return 0;
}
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re[16]: Изменения в MFC 7.0/7.1
От: Serguei666 Беларусь  
Дата: 03.06.03 13:31
Оценка:
Здравствуйте, tyomchick, Вы писали:

S>>Это всего лишь пример. Проверка может быть сколь угодно сложной.

T>Опять 25. Да, это конечно это всего лишь пример, ну так что и требовалось, я же не говорю что нужно всегда применять открытые атребуты,
Вы говорите, что НЕ ВСЕГДА можно применять открытые отрибуты, а я говорю что что НИКОГДА нельзя применять открытые атрибуты.

T>это глупо, если действительно нужна проверка или ещё какеи либо действия при установки, чтении данных то без Set/Get не обойтись.

Если сегодня проверка не нужна, это не означает, что она не понадобится через пару лет. Вам же с вашим public атрибутом придется горы кода перелопатить. Почему бы не сделать сразу правильно и навека?

T>Я всего лишь протестовал против того, что повление открытого атрибута делает код не ОО и всё.

А использование не public переменной MFC в своем коде делает его менее OO?

S>>Что значит надуман? Такое случается сплошь и рядом. Вы смотрите в отладчике, а у вас переменная имеет какое-то левое значение. "Ах ты ж ексель-моксель, когда она успела его получить?" Как искать предполагаете, с вашими двумя сотнями m_Val=ххх, разбросанными по всему коду?

T>У меня такого не случаеться. Я не себе такой код не представляю, ну то есть не писал никогда. И потом повторяю в 10ый раз, был приведён конкретный пример, показывающий лишь то, что бываюьт ситуации, когда закрывать данные не имеет смысла.
А я вам показываю ваш пример в развитии. И показываю, что имеет смысл данные закрывать с самого начала, даже если Set делает простое присвоение, а Get возвращает переменную без каких-либо манипуляций над ней, потому что завтра (которое нам не дано предугадать) и Set, и Get могут сильно усложнится, и наличие public переменной вместо Set/Get сильно испортит вам жизнь.


S>>Простой пример. Вам выдали спецификации. Вы написали программу, версию 1. Протестировали. Сдали. Все довольны. Дальше переходим к версии два. Выдаются спецификации, и тут вы видите, что, чтобы им соответствовать, надо везде поделить m_Val на два. Это называется "вдруг захотелось", не так ли? Такое возможо? При многолетнем контракте — вполне. Кто разработчик? Вы. Вам придется самому себе лысину мылить. А чтобы такого не было, надо придерживаться такого стиля, который бы позволил с заданиями легко и быстро справляться. Что я и делаю и вам советую.

T>В 12 ый раз ...
Дык и я вам одно и то же повторяю — что код вашего примера может потребовать изменений затра же. Что делать будете?


S>>>>А вы опять запускаете поиск строки "m_Val =", получаете свои 200 вхождений и аккуратненько 200 раз добавляете "/2", заметьте, без гарантии, что вы чего-либо не пропустите.

T>>>А Replace на что .

S>>Наделаете ошибок при Replace. Гарантирую.

T>Вообще то это была шутка, но гарантии здесь не уместны.
Почему? Лично пробовал и к такому выводу пришел. Так что вполне уместны.
К тому же если это шутка, то вы не ответили на вопрос. Как справлятся с такой ситуацией будете?

T>>>Тока я не понял чем SetGet от "=" отличаеться?

S>>Возможностью легкой модификации кода в одном месте без ненужного дублирования кода. Облегчением процесса отладки.
T>Мы же о пухлости говорили про какие то 16:1. Эт то тут причём.
Ну, если о пухлости и 16:1 — то SetGet получается намного компактнее чем "="
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[2]: 2 Moderator(s)
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 03.06.03 13:39
Оценка:
Предлагаю отделить эту ветку и перенести ее в "Философию".
- Искренне ваш, Поросенок Пафнутий
Re[17]: Изменения в MFC 7.0/7.1
От: vgrigor  
Дата: 03.06.03 13:44
Оценка:
S>Если сегодня проверка не нужна, это не означает, что она не понадобится через пару лет. Вам же с вашим public атрибутом придется горы кода перелопатить. Почему бы не сделать сразу правильно и навека?

Потому что бывают программы не на века во первых,
во вторых —
т.е нужно быстро написать так, а потом если понадобится усовершенствовать
всавляются Set/Get и все в порядке и оптимально во времени — без лишней работы.

В третьих когда запись удобнее, нагляднее, а пользы от Set/Get нет.

пример микрософт:
CWnd::m_hWnd — гораздо удобнее так и писать, чем вызов функции.
Тем более что вызов такой что на века, нет на него проверок разумных,
зачем код усложнять?
Винтовку добудешь в бою!
Re[14]: Изменения в MFC 7.0/7.1
От: Serguei666 Беларусь  
Дата: 03.06.03 13:46
Оценка:
Здравствуйте, tyomchick, Вы писали:

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


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



T>>>А выход как из 3-4-ох вложенных циклов как делать. Самый шик конечно исключение бросить .

S>>Самое простое и надежное — флажок выставить.

T>А примерчик в студию можно для 4ох циклов?


bool ToContinue = true;
int Counter = 0;

while(true)
{
while(true)
{
while(true)
{
while(true)
{
Counter++;
if(Counter == 666)
{
ToContinue = false;
break;
}
}
if(!ToContinue)
break;
}
if(!ToContinue)
break;
}
if(!ToContinue)
break;
}
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[3]: 2 Moderator(s)
От: vgrigor  
Дата: 03.06.03 13:46
Оценка:
Интересно:
Совсем глупая и бессмысленная ветка получилась?
(уже все поняли..??)

Или мешает основному содержанию?

Тогда — здравое предложение.
И вообще — здравое при таком подходе .
Винтовку добудешь в бою!
Re[4]: 2 Moderator(s)
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 03.06.03 13:49
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Или мешает основному содержанию?

На мой взгляд, не имеет отношения к изначальной теме — несовестимость MFC разных версий и баги MFC 7.0/7.1

V>Тогда — здравое предложение.

Рад, что Вы согласны.
- Искренне ваш, Поросенок Пафнутий
Re[5]: 2 Moderator(s)
От: vgrigor  
Дата: 03.06.03 13:53
Оценка:
Ok.
Винтовку добудешь в бою!
Re[18]: Изменения в MFC 7.0/7.1
От: Serguei666 Беларусь  
Дата: 03.06.03 14:45
Оценка:
Здравствуйте, vgrigor, Вы писали:


S>>Если сегодня проверка не нужна, это не означает, что она не понадобится через пару лет. Вам же с вашим public атрибутом придется горы кода перелопатить. Почему бы не сделать сразу правильно и навека?


V>Потому что бывают программы не на века во первых,

Это вы про лабы в институте? Тогда конечно.
А любой коммерческий продукт делают с расчетом, чтобы доить его и доить.

V>во вторых -

V>т.е нужно быстро написать так, а потом если понадобится усовершенствовать
V>всавляются Set/Get и все в порядке и оптимально во времени — без лишней работы.
"если понадобится усовершенствовать" — скажите, а как вы оцените степень надобности?


V>В третьих когда запись удобнее, нагляднее, а пользы от Set/Get нет.


V>пример микрософт:

V>CWnd::m_hWnd — гораздо удобнее так и писать, чем вызов функции.
Это субъективно. Мне удобнее писать CWnd::GetSafeHwnd()

V>Тем более что вызов такой что на века, нет на него проверок разумных,

V>зачем код усложнять?
Потому что "на века" не бывает Рано или поздно придется менять.
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[3]: 2 Moderator(s)
От: Serguei666 Беларусь  
Дата: 03.06.03 14:48
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Предлагаю отделить эту ветку и перенести ее в "Философию".

Если перенесете, сбросьте URL, ОК?
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[19]: Изменения в MFC 7.0/7.1
От: vgrigor  
Дата: 03.06.03 14:55
Оценка:
S>А любой коммерческий продукт делают с расчетом, чтобы доить его и доить.

Вообще, в серьезных проектах — да.
Это стилевое требование, несложное но полезное,
там везде надо вставлять, если вы не один пишите.

А если один и хотите быстро,
то можете и быстрее -без get/ set.


Степень надобности оценивается так:
если модуль один, если только вы его пишите,
если вы запланировали его самое простое использование,
тогда ...
Винтовку добудешь в бою!
Re[20]: Изменения в MFC 7.0/7.1
От: Serguei666 Беларусь  
Дата: 03.06.03 15:07
Оценка:
Здравствуйте, vgrigor, Вы писали:

S>>А любой коммерческий продукт делают с расчетом, чтобы доить его и доить.


V>Вообще, в серьезных проектах — да.

V>Это стилевое требование, несложное но полезное,
V>там везде надо вставлять, если вы не один пишите.

V>А если один и хотите быстро,

V>то можете и быстрее -без get/ set.

V>Степень надобности оценивается так:

V>если модуль один, если только вы его пишите,
V>если вы запланировали его самое простое использование,
V>тогда ...

Так это все возможно только при написании маленьких примеров для личного пользования. А мы же тут про работу говорим. Которая, само собой, связана с очень серьезными проектами
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[21]: Изменения в MFC 7.0/7.1
От: vgrigor  
Дата: 03.06.03 15:13
Оценка:
Вам может захотеться написать пилотный проект быстро,
не оформляя его по мелочам круто, не отвлекаясь.

Это Типичная практика.

Когда заработает, видно лучше все части которые стоит удалить
не переписывая, какие существенно усовершенствовать,
главное чтобы быстро заработала общая картина,

а потом,
вот тогда и пишется Get/Set,
Винтовку добудешь в бою!
Re[14]: Изменения в MFC 7.0/7.1
От: Serguei666 Беларусь  
Дата: 03.06.03 15:13
Оценка:
Здравствуйте, tyomchick, Вы писали:

T>И попробуйте переделать вот такой код из MSDN, ну хотя бы на словах.


#define UNICODE

#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <urlmon.h>
#include <hlink.h>
#include <dispex.h>
#include "mshtml.h"
#include "msxml.h"

#define ASSERT(x)  if(!(x)) DebugBreak()
//#define CHECK_ERROR(cond, err) if (!(cond)) {pszErr=(err); goto done;}
#define SAFERELEASE(p) if (p) {(p)->Release(); p = NULL;} else ;


int _cdecl main (int argc, char **argv)
{
    PSTR pszErr = NULL;
    IXMLDocument           *pDoc = NULL;
    IStream                *pStm = NULL;
    IPersistStreamInit     *pPSI = NULL;
    CHAR                   buf[MAX_PATH];
    CHAR                   *pszURL;

    HRESULT hr;

    //
    // Check usage.
    //
    if (argc != 2)
    {
        fprintf (stderr, "Usage:   %s URL\n", argv[0]);
        fprintf (stderr, "Eg %s c:\\nt\\private\\inet\\xml\\test\\channel.cdf\n", argv[0]);
        fprintf (stderr, "or %s http://ohserv/users/julianj/msnbc.cdf\n", argv[0]);
        exit (1);
    }

    //
    // HACK if passed in a file name; expand if it doesn't look like a URL.
    //
    if (CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, argv[1], 7, "http://", 7) == CSTR_EQUAL)
    {
        pszURL = argv[1];
    }
    else
    {
        pszURL = buf;
        GetFullPathNameA(argv[1], MAX_PATH, pszURL, NULL);
    }

    hr = CoInitialize(NULL);
    ASSERT(SUCCEEDED(hr));

    //
    // Create an empty XML document.
    //
    hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
                                IID_IXMLDocument, (void**)&pDoc);

    if(!pDoc) 
         pszErr = "CoCreateInstance Failed";
     else
     {
         //
         // Synchronously create a stream on a URL.
         //
         hr = URLOpenBlockingStreamA(0, pszURL, &pStm, 0,0);
         if(!(SUCCEEDED(hr) && pStm))
            pszErr = "Couldn't open stream on URL";
         else
         {
             //
             // Get the IPersistStreamInit interface to the XML doc.
             //
             hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI);
             if(hr)
                pszErr = "QI for IPersistStreamInit failed";
             else
             {    
                 //
                 // Init the XML doc from the stream.
                 //
                 hr = pPSI->Load(pStm);

                 if(SUCCEEDED(hr))
                 {
                      printf("%s : XML File is well formed \r\n",argv[0]);

                 }
                 else
                 {
                      // Print error information !
                      IXMLError *pXMLError = NULL ;
                      XML_ERROR xmle;

                      hr = pPSI->QueryInterface(IID_IXMLError, (void **)&pXMLError);
                      if(!SUCCEEDED(hr))
                        pszErr = "Couldn't get IXMLError";
                      else
                      {
                          ASSERT(pXMLError);

                          hr = pXMLError->GetErrorInfo(&xmle);
                          SAFERELEASE(pXMLError);
                          if(!SUCCEEDED(hr))
                            pszErr = "GetErrorInfo Failed";
                          else
                          {
                              printf("%s :", argv[0]);
                              wprintf(TEXT(" Error on line %d. Found %s while expecting %s\r\n"),
                                                         xmle._nLine,
                                                         xmle._pszFound,
                                                         xmle._pszExpected); 
        
                              SysFreeString(xmle._pszFound);
                              SysFreeString(xmle._pszExpected);
                              SysFreeString(xmle._pchBuf);
                          }
                      }
                 }
             }
         }
     }

//done: // Clean up.
    //
    // Release any used interfaces.
    //
    SAFERELEASE(pPSI);
    SAFERELEASE(pStm);
    SAFERELEASE(pDoc);

    if (pszErr)
        fprintf (stderr, "%s, last error %d\n", pszErr, GetLastError());
    return 0;
}
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[22]: Изменения в MFC 7.0/7.1
От: Serguei666 Беларусь  
Дата: 03.06.03 15:27
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Вам может захотеться написать пилотный проект быстро,

V>не оформляя его по мелочам круто, не отвлекаясь.
V>Когда заработает, видно лучше все части которые стоит удалить
V>не переписывая, какие существенно усовершенствовать,
V>главное чтобы быстро заработала общая картина,

Вот у нас примерно так и было. "Пилотный проект" начался 4 года назад. До сих пор мусор из кода убираю. А его много, и главное, вам никто не дает время на то, чтобы его убирать. Пользователи платят деньги не за некие внутренние оптимизации, которые им не дадут ничего, а вам облегчат жизнь. Пользователи хотят за свои деньги получить след. версию лучше чем предыдушая. А времени на то и другое не хватает.

"Нет ничего более постояного, чем временные явления". Если вы работаете в команде, если проект более чем просто примерчик для самого себя — то лучше сразу все делать правильно. Это мое мнение, основанное на моем же опыте.
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[23]: Изменения в MFC 7.0/7.1
От: vgrigor  
Дата: 03.06.03 15:38
Оценка:
Если первый проект получтся за три месяца, а такое бывает — вы просто пробуете все применяемые технологии,
про годы никто не говорит, это не пилотный проек а неудача,
нечего оформление усложнять ненужное крючочками.

Крючочки потом вставляются за пару дней. А терять время на простановку в процессе — это неприятно — терять нить
идеи.

S>"Нет ничего более постояного, чем временные явления". Если вы работаете в команде, если проект более чем просто примерчик для самого себя — то лучше сразу все делать правильно. Это мое мнение, основанное на моем же опыте.


Во всяком случае вы его ничем реальным не подтвердили, так что эти слова не вполне в вашу пользу.
Хотя писать надо сразу правильно конечно, где важно — но надо понимать почему и где — а не просто так получается.

Если в коллективе свой кусок,- это важно,
а если изолированный кусок от него, с интерефейсом — то можете быстро попробовать, все равно о вашем внутреннем коде
никто не узнает.
Это вроде как современная технология, а не взаимопереплетение если вы пишете расширяемую библиотку, что редкость среди прикладны товарищей .
Так что по крайней мере технологически это обходится.
Винтовку добудешь в бою!
Re[15]: Изменения в MFC 7.0/7.1
От: Аноним  
Дата: 03.06.03 17:22
Оценка:
Эт tymchick, просто у меня cook-исы слетели а пароль забыл.

T>>А примерчик в студию можно для 4ох циклов?


S>bool ToContinue = true;

S>int Counter = 0;

S>while(true)

S>{
S> while(true)
S> {
S> while(true)
S> {
S> while(true)
S> {
S> Counter++;
S> if(Counter == 666)
S> {
S> ToContinue = false;
S> break;
S> }
S> }
S> if(!ToContinue)
S> break;
S> }
S> if(!ToContinue)
S> break;
S> }
S> if(!ToContinue)
S> break;
S>}

Вот, вот. Это я называю маразмом псевдоструктурного программирования в чистом виде. Снижаеться производительность, читабельность только что б не страшный goto, несмотря на то что применение goto здесь выгодно во всех отношениях.
Re[17]: Изменения в MFC 7.0/7.1
От: Аноним  
Дата: 03.06.03 17:54
Оценка:
Здравствуйте, Serguei666, Вы писали:


S>Дык и я вам одно и то же повторяю — что код вашего примера может потребовать изменений затра же. Что делать будете?


Я всё же с вами не соглашусь.

1. Для многих данных можно сказать что их преобразование или проверка не может понадобиться никогда.


2. Приведённый вками пример про m_Val/2 абсолютно не корректен. Если вы так пишите программы то вам надо задуматься о вашей квалификации. Так не проектируют. Что бы реализация класса менялась из-за того, что программист решил что один из параметров расчётов нужно сделать в 2 раза меньше ... эт полный аут. Я себе представляю документацию к программе.
"Ну вот это параметр надо установить в 2 раза больше чем необходимо для расчёта. Ну это потому что этот класс использовался в таком то коде и программеру лень было лазить по коду и менять его."
3. Я всё же не представляю кода в котором может быть не то, что 200, а даже и 10 установок параметра при том что все эти куски кода были абсолютно разнородны и их никаким образом не нелльзя было оформить в виде отдельной функции.


S>>>>>А вы опять запускаете поиск строки "m_Val =", получаете свои 200 вхождений и аккуратненько 200 раз добавляете "/2", заметьте, без гарантии, что вы чего-либо не пропустите.

T>>>>А Replace на что .

S>>>Наделаете ошибок при Replace. Гарантирую.

T>>Вообще то это была шутка, но гарантии здесь не уместны.
S>Почему? Лично пробовал и к такому выводу пришел. Так что вполне уместны.
То есть вы мне гарантирууту, что я возьму 100 примеров, зселаю там Replace и в каждом случае у меня будет ошибка? Смело однако.

S>К тому же если это шутка, то вы не ответили на вопрос. Как справлятся с такой ситуацией будете?


На счёт этой ситуации я уже ответил.

T>>Мы же о пухлости говорили про какие то 16:1. Эт то тут причём.

S>Ну, если о пухлости и 16:1 — то SetGet получается намного компактнее чем "="
Я не понию почему тут если
И ещё я наверно туплю, почему это SetGet получаються компактнее.

SetVal(Val); // 12

m_Val=Val; // 10

+ протокол и реализация методов.



Мдя, до каких вопросов опустилиь
Re[15]: Изменения в MFC 7.0/7.1
От: Аноним  
Дата: 03.06.03 18:03
Оценка:
Здравствуйте, Serguei666, Вы писали:

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


T>>И попробуйте переделать вот такой код из MSDN, ну хотя бы на словах.


S>
S>#define UNICODE

S>#include <windows.h>
S>#include <windowsx.h>
S>#include <stdlib.h>
S>#include <stdio.h>
S>#include <io.h>
S>#include <urlmon.h>
S>#include <hlink.h>
S>#include <dispex.h>
S>#include "mshtml.h"
S>#include "msxml.h"

S>#define ASSERT(x)  if(!(x)) DebugBreak()
S>//#define CHECK_ERROR(cond, err) if (!(cond)) {pszErr=(err); goto done;}
S>#define SAFERELEASE(p) if (p) {(p)->Release(); p = NULL;} else ;


S>int _cdecl main (int argc, char **argv)
S>{
S>    PSTR pszErr = NULL;
S>    IXMLDocument           *pDoc = NULL;
S>    IStream                *pStm = NULL;
S>    IPersistStreamInit     *pPSI = NULL;
S>    CHAR                   buf[MAX_PATH];
S>    CHAR                   *pszURL;

S>    HRESULT hr;

S>    //
S>    // Check usage.
S>    //
S>    if (argc != 2)
S>    {
S>        fprintf (stderr, "Usage:   %s URL\n", argv[0]);
S>        fprintf (stderr, "Eg %s c:\\nt\\private\\inet\\xml\\test\\channel.cdf\n", argv[0]);
S>        fprintf (stderr, "or %s http://ohserv/users/julianj/msnbc.cdf\n", argv[0]);
S>        exit (1);
S>    }

S>    //
S>    // HACK if passed in a file name; expand if it doesn't look like a URL.
S>    //
S>    if (CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, argv[1], 7, "http://", 7) == CSTR_EQUAL)
S>    {
S>        pszURL = argv[1];
S>    }
S>    else
S>    {
S>        pszURL = buf;
S>        GetFullPathNameA(argv[1], MAX_PATH, pszURL, NULL);
S>    }

S>    hr = CoInitialize(NULL);
S>    ASSERT(SUCCEEDED(hr));

S>    //
S>    // Create an empty XML document.
S>    //
S>    hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
S>                                IID_IXMLDocument, (void**)&pDoc);

S>    if(!pDoc) 
S>         pszErr = "CoCreateInstance Failed";
S>     else
S>     {
S>         //
S>         // Synchronously create a stream on a URL.
S>         //
S>         hr = URLOpenBlockingStreamA(0, pszURL, &pStm, 0,0);
S>         if(!(SUCCEEDED(hr) && pStm))
S>            pszErr = "Couldn't open stream on URL";
S>         else
S>         {
S>             //
S>             // Get the IPersistStreamInit interface to the XML doc.
S>             //
S>             hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI);
S>             if(hr)
S>                pszErr = "QI for IPersistStreamInit failed";
S>             else
S>             {    
S>                 //
S>                 // Init the XML doc from the stream.
S>                 //
S>                 hr = pPSI->Load(pStm);

S>                 if(SUCCEEDED(hr))
S>                 {
S>                      printf("%s : XML File is well formed \r\n",argv[0]);

S>                 }
S>                 else
S>                 {
S>                      // Print error information !
S>                      IXMLError *pXMLError = NULL ;
S>                      XML_ERROR xmle;

S>                      hr = pPSI->QueryInterface(IID_IXMLError, (void **)&pXMLError);
S>                      if(!SUCCEEDED(hr))
S>                        pszErr = "Couldn't get IXMLError";
S>                      else
S>                      {
S>                          ASSERT(pXMLError);

S>                          hr = pXMLError->GetErrorInfo(&xmle);
S>                          SAFERELEASE(pXMLError);
S>                          if(!SUCCEEDED(hr))
S>                            pszErr = "GetErrorInfo Failed";
S>                          else
S>                          {
S>                              printf("%s :", argv[0]);
S>                              wprintf(TEXT(" Error on line %d. Found %s while expecting %s\r\n"),
S>                                                         xmle._nLine,
S>                                                         xmle._pszFound,
S>                                                         xmle._pszExpected); 
        
S>                              SysFreeString(xmle._pszFound);
S>                              SysFreeString(xmle._pszExpected);
S>                              SysFreeString(xmle._pchBuf);
S>                          }
S>                      }
S>                 }
S>             }
S>         }
S>     }

S>//done: // Clean up.
S>    //
S>    // Release any used interfaces.
S>    //
S>    SAFERELEASE(pPSI);
S>    SAFERELEASE(pStm);
S>    SAFERELEASE(pDoc);

S>    if (pszErr)
S>        fprintf (stderr, "%s, last error %d\n", pszErr, GetLastError());
S>    return 0;
S>}
S>


B превратился и так не сильно удобоваримый "COM-код" в абсолютный ужас. И заметте это можно сказать только начало кода, а дальше должен идти разбор XML-документа с поджключением многих интерфейсов и много чего ещё. А 10-20 вложенных if-ов эт конечно "красиво", а уж как "структурировано" и "читабельно". Только бы в скобочках не запутаться. Хотя нет, всемогущий редактр VS нас конечно спасёт? Жаль что не все редакторы так всемогущи.
Re[16]: Изменения в MFC 7.0/7.1
От: Аноним  
Дата: 03.06.03 18:11
Оценка:
Здравствуйте, Аноним, Вы писали:

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


T>>>И попробуйте переделать вот такой код из MSDN, ну хотя бы на словах.



А> А 10-20 вложенных if-ов эт конечно "красиво", а уж как "структурировано" и "читабельно".

Правда справедливости ради надо сказать, что тут как раз уместны исключения.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.