Cum inchid documentele la OnFileNew si OnFileOpen ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Silviu Ardelean » 26 Aug 2011, 23:49

Ovidiu Cucu wrote:
Silviu Ardelean wrote:Offtopic: Ovidiu, crede-ma ca toate aceste motive imi sunt cunoscute si traite pe propria piele. Apropo de strut-o camila VB, stii ca VS 2010 se intoarce la liman via Class Wizard. :)
Da, Silviu, stiu asta inca de pe vremea cand VS2010 nu facuse inca ochi iar mosnegi ca mine au iesit in strada strigand "Vrem ClassWizard inapoi!". :)
Scuze! Ulterior mi-am adus aminte ca o pasarica mi-a soptit cu cel putin un an inainte de lansarea lui VS2010: Class Wizard will be back! :)



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 27 Aug 2011, 09:17

[ off-topic ]
Silviu Ardelean wrote:
Ovidiu Cucu wrote:
Silviu Ardelean wrote:Offtopic: Ovidiu, crede-ma ca toate aceste motive imi sunt cunoscute si traite pe propria piele. Apropo de strut-o camila VB, stii ca VS 2010 se intoarce la liman via Class Wizard. :)
Da, Silviu, stiu asta inca de pe vremea cand VS2010 nu facuse inca ochi iar mosnegi ca mine au iesit in strada strigand "Vrem ClassWizard inapoi!". :)
Scuze! Ulterior mi-am adus aminte ca o pasarica mi-a soptit cu cel putin un an inainte de lansarea lui VS2010: Class Wizard will be back! :)
Nu trebuia sa-ti "sopteasca o pasarica" ceva care era evident. Daca n-ar fi facut ClassWizard-ul aia de la VC++, l-ar fi facut facut altii.
Pacat totusi ca a venit destul de tarziu cand mai toata lumea s-a obisnuit deja fara.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 28 Aug 2011, 00:13

:D Faza tare e ca in mod Release merge brici, si mie imi convine ca doar produsul final e in Release mode ... dar asta e cu doua taisuri, cine stie de ce probleme dau mai incolo ?! O sa imi pun si un SP, ca pana acum m-am tot plimblat cu BreakPoint-uri prin proiect ...

Am compilat acest proiect de test si in VC2008 (mi-am pus pentru scurt timp VS2008) si nici acolo n-are probleme intradevar ...

Ca tot ati vorbit de ClassWizzard-ul din VS2010, daca tot e sa trec la un mediu mai nou decat VC6, merita VS2010 sau VS2008 ? Am citit prin forumuri ca VS2008-ul e bunisor si stabil, dar nu are ClassWizzard ... desi teoretic VS2010 ar trebui sa fie mai OK, doar e mai nou ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 28 Aug 2011, 13:17

mesajflaviu wrote::D Faza tare e ca in mod Release merge brici, si mie imi convine ca doar produsul final e in Release mode ... dar asta e cu doua taisuri, cine stie de ce probleme dau mai incolo ?!
E cu multe taisuri... ;)

In release "merge brici" pentru ca in release assert-urile sar din schema.
Macro-uri gen ASSERT, ASSERT_VALID si altele din seria lor, sunt definite cam asa:

Code: Select all

#ifdef _DEBUG
// ...
#define ASSERT(f) \
	do \
	{ \
	if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
		AfxDebugBreak(); \
	} while (0) \
#define ASSERT_VALID(pOb)  (::AfxAssertValidObject(pOb, THIS_FILE, __LINE__))
// ...
#else
// ...
#define ASSERT(f)   ((void)0)
#define ASSERT_VALID(pOb)  ((void)0)
// ...
#endif
Rostul lor este sa traga de urechi un programator atunci cand face greseli de programare.
Chiar daca in debug dam ignore si nu crapa imediat sau in release pare ca "merge brici" nu inseamana ca totu-i OK.
De exemplu, cineva "grabit" scrie...

Code: Select all

void CMySDIDoc::Serialize(CArchive& ar)
{
   // just demo, loading image from a bitmap file
   if(ar.IsLoading())
   {
      CString strFileName = ar.m_pDocument->GetPathName();
      HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, strFileName,
         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

      m_bitmap.Attach(hBitmap);
   }
}

...la apeluri consecutive, in debug o sa sara un minunat "Debug Assertion Failed".
Daca da "Ignore" , aparent merge.
La fel, in release o sa para ca merge si mai si.
Problema e ca nu se stie pana cand... (de cele mai multe ori crapa in release la client, si nu stie de ce)
Daca-i baiat destept si da "Retry", atunci vede asta:

Code: Select all

BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
   ASSERT(m_hObject == NULL);  // only attach once, detach on destroy
   //...
}
"Ahaaaa!... parca-parca mi-a spus cineva ca trebuie golit cosul, altfel mai devreme sau mai tarziu da pe dinafara.
Deci, corecteaza:

Code: Select all

void CMySDIDoc::Serialize(CArchive& ar)
{
   // just demo, loading image from a bitmap file
   if(ar.IsLoading())
   {
      if(NULL != m_bitmap.GetSafeHandle())
      {
         m_bitmap.DeleteObject(); // detach handle and destroy the GDI object
      }
      // ... all the rest like above


In concluzie ASSERT-urile sunt cu folos si nu trebuie ignorate.
Ca unii programatori le folsesc aiurea (de exemplu testeaza condititi la run-time) asta-i alta mancare de peste.
Dar in alea din MFC poti sa ai incredere, sunt bine puse.

In cazul nostru, e destul de greu sa-mi dau seama unde e de fapt buba.
Pentru ca am testat pe acelasi proiect, ambii cu VS6.0 si nu cred ca problema are ceva de-a face cu sistemul de operare, urmatoarea cauza la care ma gandesc este lipsa service pack-ului la tine.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 28 Aug 2011, 13:58

[ off-topic ]
mesajflaviu wrote: Ca tot ati vorbit de ClassWizzard-ul din VS2010, daca tot e sa trec la un mediu mai nou decat VC6, merita VS2010 sau VS2008 ? Am citit prin forumuri ca VS2008-ul e bunisor si stabil, dar nu are ClassWizzard ... desi teoretic VS2010 ar trebui sa fie mai OK, doar e mai nou ...
Eu unul am VS2005 si 2010, fiecare pe o instanta separata de Windows (2005 pe XP si 2010 pe Windows 7).
Nu recomand doua versiuni la un loc pentru ca, desi aparent merg impreuna, apar tot felul de "glume" cand incepi sa te joci cu SP-uri si update-uri de SDK.
Desi e mai strong si mai aromat, din 2010 nu gust foarte des, deocamdata. Acum e cam tulburel iar tulburelul te ia de cap... Astept sa se limpezeasca un pic. :)
2008-ul cu SP1 aduce in plus la VC++ fata de 2005 acele clase din "MFC feature pack": riboane si alte cularai.Personal, pot trai si fara ele.

In concluzie, deocamdata folosesc in mod curent 2005 care e suficient pentru majoritatea aplicatiilor de C++.
A,.. mai am si VS6.0, de suflet... :)

[ later edit ]
Daca ai deja si 2008 si 2010 eu zic sa le pui pe amandoua si te convingi singur ce si cum.
In schimb, daca se pune problema cu ori-ori, as merge pe pe 2010.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 01 Sep 2011, 14:08

Tocmai am testat cu VS6.0 fara SP.
Problema e in framework:

Code: Select all

CFrameWnd* PASCAL CCmdTarget::GetRoutingFrame_()
{
   CFrameWnd* pFrame = AfxGetThreadState()->m_pRoutingFrame;
   if (pFrame != NULL)
      ASSERT_VALID(pFrame);
   return pFrame;
}
Dupa cum banuiam, pFrame e "carcalaci" drept care ASSERT_VALID da kix.
Dupa ce pui Service Pack 5, totul devine OK.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 02 Sep 2011, 10:48

Cand rulam aplicatia pas cu pas, am ajuns si la aceasta linie de cod ... am vazut ca numai combinatia VC6 fara SP + Win7 da probleme, in rest merge bine ... insa aplicatia va trebui ascunsa in sistem tray si va trebui sa mai arunce din cand in cand cate un balon de notificare folosind structura NOTIFYICONDATA, ori membrul dwInfoFlags al acestei structuri nu este recunoscut de VC6 si voi fi nevoit sa compilez totul intr-un mediu mai nou, de unde rezulta ca voi scapa de aceasta problema.

Multumesc mult pentru indrumari !

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 02 Sep 2011, 17:11

Nu, nu numai combinatia "VC6 fara SP + Win7" da probleme ci in general "VC6 fara SP".
Cum am mai spus, e vorba de un bug de framework ce a fost scos intr-un SP. Ce se intampla acolo de fapt e mai greu de vazut (desi nu imposibil) dar cred ca nu merita de pierdut timpul cu ceva care a fost solvat. Deci, inca odata: pune VC6-SP5, altfel o sa ai si alte probleme, nu numai aceasta. Punct.

Cu acel tray icon cu "balloon" nu-i un capat de lume nici daca folosesti VS6.0.
Se poate defini "ciobaneste" propria structura NOTIFYICONDATA-like sau, un pic mai bine se poate instala PSDK din Martie 2003, ultimul care se mai pupa cu VS6. Vezi: Cum instalez Windows SDK pentru Visual C++ 6.0?
Bineinteles, solutia ideala este un VS mai nou.
Aici intradevar sunt ceva probleme legate de OS (mai binezis de versiunea lui Shell32.dll) dar cred ca asta face subiectul unei alte discutii.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 03 Sep 2011, 18:25

Hmm, nu mi-a reusit update-ul la VS6 : am instalat CoreSDK-x86.msi, Dbg-x86.msi, IESDK-x86.msi, IISSDK-x86.msi, MDACSDK-x86.msi, MSISDK-x86.msi, PSDK-x86.msi, WMISDK-x86.msi, si WMSSDK-x86.msi. Apoi le-am inregistrat din AllPrograms -> ... Visual Studio Registration -> Register PSDK Directories with Visual Studios, mi-a pus automat in VC6/Tools/Options/Directories acele cai catre Include/Libraries, dar degeaba, aceeasi comportare la proiectul test ... desi, eu cred ca s-a instalat bine SDK-ul, fiindca la proiectul bun am warning-uri ca am redefinit RT_MANIFEST de exemplu ...
La un moment dat am dezinstalat SDK-ul si l-am instalat la loc, l-am configurat manual (am pus manual acele cai in VC6/Tools/Options/Directories), dar degeaba ... mai sap, ca cine stie ce gogomanie am facut pe aici, si in ultima instanta o sa compilez proiectul intr-un mediu mai nou ....
Se poate defini "ciobaneste" propria structura NOTIFYICONDATA-like
Tare ! :biggrin:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by Ovidiu Cucu » 03 Sep 2011, 22:03

  1. instalezi Service Pack 5 pentru VS6 pentru a scapa de bug-uri de MFC-framework, ca acela din proiectul de test pe care l-ai atasat aici.
  2. instalezi Plaform SDK (PSDK) pentru a beneficia de un Windows SDK mai nou decat cel care vine cu VS6 (incluzand versiunea actualizata a lui NOTIFYICONDATA).
SP si PSDK NU sunt una si aceeasi mancare de peste.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 05 Sep 2011, 15:11

Cand am zis ca fac vreo gogomanie la instalarea de update-uri la VC6 am vorbit serios :biggrin: ! O sa pun si un SP la VC6.

Post Reply