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 » 25 Aug 2011, 23:35

Am testat in VS 2005 salvand cateva fisiere si apoi le deschideam aleatoriu. Totul functiona ok: fisierul deja deschis se inchidea inainte de-a deschide un alt fisier.



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

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 26 Aug 2011, 07:57

Hmm ... in VC6 da eroare de assert la appui1.cpp line 215 ... ciudat ...

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, 08:19

Cred ca e momentul sa faci un upgrade. Sa nu uitam ca VS 6 are deja 13 ani!
Oricum, SARI peste VS 2003. Compilatorul VC++ din 2003 e paf...

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 » 26 Aug 2011, 08:31

Ce-i la tine in appui1.cpp la linia si pe langa?
La mine e asa.

Code: Select all

CFrameWnd* PASCAL CCmdTarget::GetRoutingFrame_()
{
	CFrameWnd* pFrame = AfxGetThreadState()->m_pRoutingFrame;
	return pFrame;
}

/////////////////////////////////////////////////////////////////////////////
Cea cu //////////-uri e linia 215. :biggrin:
VS6.0 - SP5

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

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 26 Aug 2011, 08:41

Cand dau retry ma duce in OBJCORE.CPP la :

Code: Select all

	// check to make sure the VTable pointer is valid
	ASSERT(sizeof(CObject) == sizeof(void*));
	if (!AfxIsValidAddress(*(void**)pOb, sizeof(void*), FALSE))
	{
		TRACE0("ASSERT_VALID fails with illegal vtable pointer.\n");
		if (AfxAssertFailedLine(lpszFileName, nLine))
			AfxDebugBreak();    <--linia la care se opreste
		return;     // quick escape
	}

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 » 26 Aug 2011, 10:58

Ceea ce ai pus tu aici provine din AfxAssertValidObject si-ti arata ca si cum pe undeva ai un pointer in balarii.
Dupa ce dai "Retry" uita-te in "Call Stack" (Alt+7) ca sa vezi de unde sare leopardu'.

Daca sigur-sigur testam pe acelasi cod sursa nu stiu ce sa zic. Nu pot acum decat sa dau cu presupusul.
Se poate ca intradevar sa fie o buba in cod si n-am reusit sa reproduc exact cazul, dar pot si si alte cauze.
Uneori la crapacini din astea te salveaza un simplu "Rebuild All" desi nu cred ca e cazul aici.
Ai Service Pack instalat?
Din cate imi aduc aminte VS6.0 "curat" are ceva bube si de aceea au scos vreo 6 SP-uri. Eu unul am lucrat intotdeauna cu SP5.
Poti vedea ce SP ai instalat aruncand un ochi in registry la:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\ServicePacks\"latest"
Daca nu vezi acolo cel putin valoarea '5', iti recomand cu caldura sa-l cauti si sa-l instalezi.

[ off-topic ]
@Silviu
Bineinteles ca trecerea la o versiune mai noua de VS e "calea cea dreapta", totusi pot exista N motive sa mai apelezi din cand in cand la batranul VS6.0:
  • Lucrezi la un proiect mai vechi la care avantajele portarii nu justifica efortul.
  • Sefu' n-are sau nu vrea sa dea parale ca sa cumpere ceva mai nou.
  • Sistemul target nu se pupa cu ce scuipa versiunile mai noi.
  • Vrei sa faci deployment fara sa-ti bati capul cu redistributables, side-by-side assemblies si alte glume.
  • Faci un proiectel demo si vrei ca sa-l poata bildui fara probleme oricine are ceva de la VS6.0 incoace.
  • Vrei sa gasesti usor exemplele (in VS6.0 vin pe CD). La cele noi trebuie sa le cauti prin nustiuce arhiva in care de multe ori constati ca... mai e unele care nu-s (am parafrazat vorba unui vajnic subofiter al armatei romane "mai e unii (soldati) care nu-s" :)).
  • Last but not the least: preferi un IDE dedicat (V)C++ si nu o strutzocamila VB-style. :)

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, 11:37

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. :)

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 » 26 Aug 2011, 12:02

Doua observatii colaterale:
  • Odata ce ai hendluit ID_FILE_NEW si ID_FILE_OPEN in aplicatie, sterge macro-urile alea pe care le-a pus wizard-ul:

    Code: Select all

    	// Standard file based document commands
    	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
    	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    Nu cred ca asta-i o problema, pentru ca sunt in messsage map dupa ale tale, dar nu se stie niciodata si oricum sigur nu mai au rost.
  • Este ciudat ca initial ai spus de un assert la linia 215 din appui1.cpp unde am vazut ca sta bine-mersi un comentariu, departe de orice alte assert-uri din acel fisier.
    Cel mai probabil a fost vorba de un build prost. Un "Rebuild All" de care am mai povestit poate repara situatia. Ca sa fii mai sigur, cu o abordare putin mai "paranoica" ai putea sterge mai intai toate fisierele intermediare/generate de IDE.

    Mai exista posibilitatea ca sa fi modificat din greseala fisiere sursa din MFC (eu unul am patit-o).
    Sper sa nu fie asa pentru ca in cazul asta e naspa. Ar trebui sa reinstalezi VS-ul.
    Si fie vorba intre noi: orice soft trebuie reinstalat din cand in cand. ;)

[ off-topic ]
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!". :)

[ later edit ]
Dupa ce am dat primele click-uri prin VS.NET (2002), m-am dus repede si-am zis: "Sefu', cred ca tre sa mai scoti ceva parale sa iei versiunea enterprise. Asta professional n-are ClassWizard". :biggrin:

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

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 26 Aug 2011, 13:20

La mine linia 215 din appui1.cpp este aici :

Code: Select all

CFrameWnd* PASCAL CCmdTarget::GetRoutingFrame_()
{
	CFrameWnd* pFrame = AfxGetThreadState()->m_pRoutingFrame;
	if (pFrame != NULL)
		ASSERT_VALID(pFrame);    // <- linia 215 ...
	return pFrame;
}
e ciudat totusi, pentru ca daca dau 'Retry' debugger-ul ma duce asa cum am spus la OBJCORE.CPP cum am scris mai sus ...

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

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 26 Aug 2011, 13:26

Linia cu buba din OnFileOpen este :

Code: Select all

void CTestApp::OnFileOpen() 
{
	// TODO: Add your command handler code here

	SaveAllModified();
	CloseAllDocuments(FALSE);

//	CWinApp::OnFileOpen();    // <- linia la care "sare" assertu ...

	POSITION posTemplate = GetFirstDocTemplatePosition();
	if(posTemplate)
	{
		GetNextDocTemplate(posTemplate);
		while(posTemplate)
		{
			CDocTemplate* pDocTemplate = GetNextDocTemplate(posTemplate);
			pDocTemplate->OpenDocumentFile(NULL);
		}
	}
}

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

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 26 Aug 2011, 13:43

Cum as putea gasi implementarea clasei CWinApp (fisierul cpp) ? Header-ul l-am gasit in afxwin.h cu F12 ...

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 » 26 Aug 2011, 14:06

Pui un breakpoint in lnia cu CWinApp::OnFileOpen() iar cand ajungi acolo step into (F11).
Altfel, suprascrie o functie virtuala in care o chemi pe cea din clasa de baza si tot asa: brakpoint si F11.
Altfel, dai "Edit/Find in files..." si cauti o functie din CWinApp in directorul unde sunt sursele de MFC.
Si-or mai fi...

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

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 26 Aug 2011, 16:50

Am fotografiat "call stack"-ul :

Code: Select all

AfxAssertValidObject(const CObject * 0x002f2500 {CObject}, const char * 0x5f4cdac4 THIS_FILE, int 215) line 96
CCmdTarget::GetRoutingFrame_() line 216
CWnd::GetSafeOwner_(HWND__ * 0x00000000, HWND__ * * 0x0012f0c0) line 159 + 5 bytes
CDialog::PreModal() line 467 + 24 bytes
CFileDialog::DoModal() line 90 + 8 bytes
CDocManager::DoPromptFileName(CString & {""}, unsigned int 61440, unsigned long 4100, int 1, CDocTemplate * 0x00000000 {CDocTemplate}) line 615 + 11 bytes
CDocManager::OnFileOpen() line 836 + 29 bytes
CWinApp::OnFileOpen() line 37
CTestApp::OnFileOpen() line 194
_AfxDispatchCmdMsg(CCmdTarget * 0x00417810 class CTestApp theApp, unsigned int 57601, int 0, void (void)* 0x0040114a CTestApp::OnFileOpen(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
CCmdTarget::OnCmdMsg(unsigned int 57601, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
CFrameWnd::OnCmdMsg(unsigned int 57601, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 899 + 33 bytes
CWnd::OnCommand(unsigned int 57601, long 919506) line 2088
CFrameWnd::OnCommand(unsigned int 57601, long 919506) line 317
CWnd::OnWndMsg(unsigned int 273, unsigned int 57601, long 919506, long * 0x0012f594) line 1597 + 28 bytes
CWnd::WindowProc(unsigned int 273, unsigned int 57601, long 919506) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x002f2500 {CWnd hWnd=0xdddddddd}, HWND__ * 0x001306d4, unsigned int 273, unsigned int 57601, long 919506) line 215 + 26 bytes
CMDIFrameWnd::OnCommand(unsigned int 57601, long 919506) line 55 + 35 bytes
CWnd::OnWndMsg(unsigned int 273, unsigned int 57601, long 919506, long * 0x0012f75c) line 1597 + 28 bytes
CWnd::WindowProc(unsigned int 273, unsigned int 57601, long 919506) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x002f13c0 {CMainFrame hWnd=???}, HWND__ * 0x00120702, unsigned int 273, unsigned int 57601, long 919506) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x00120702, unsigned int 273, unsigned int 57601, long 919506) line 368
AfxWndProcBase(HWND__ * 0x00120702, unsigned int 273, unsigned int 57601, long 919506) line 220 + 21 bytes
USER32! 761786ef()
USER32! 76178876()
USER32! 76177631()
USER32! 76177695()
COMCTL32! 75e8ce2d()
COMCTL32! 75e79fdd()
USER32! 761786ef()
USER32! 76178876()
USER32! 761743cf()
USER32! 761941f9()
CWnd::DefWindowProcA(unsigned int 514, unsigned int 0, long 458781) line 1000 + 32 bytes
CWnd::WindowProc(unsigned int 514, unsigned int 0, long 458781) line 1586 + 26 bytes
CControlBar::WindowProc(unsigned int 514, unsigned int 0, long 458781) line 470 + 20 bytes
AfxCallWndProc(CWnd * 0x002f1504 {CToolBar hWnd=0x000e07d2}, HWND__ * 0x000e07d2, unsigned int 514, unsigned int 0, long 458781) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x000e07d2, unsigned int 514, unsigned int 0, long 458781) line 368
AfxWndProcBase(HWND__ * 0x000e07d2, unsigned int 514, unsigned int 0, long 458781) line 220 + 21 bytes
USER32! 761786ef()
USER32! 76178876()
USER32! 761789b5()
USER32! 76178e9c()
USER32! 76177033()
USER32! 761840c4()
CWnd::IsDialogMessageA(tagMSG * 0x00417848 {msg=0x00000202 wp=0x00000000 lp=0x0007001d}) line 182
CWnd::PreTranslateInput(tagMSG * 0x00417848 {msg=0x00000202 wp=0x00000000 lp=0x0007001d}) line 3424
CControlBar::PreTranslateMessage(tagMSG * 0x00417848 {msg=0x00000202 wp=0x00000000 lp=0x0007001d}) line 424
CWnd::WalkPreTranslateTree(HWND__ * 0x00120702, tagMSG * 0x00417848 {msg=0x00000202 wp=0x00000000 lp=0x0007001d}) line 2667 + 18 bytes
CWinThread::PreTranslateMessage(tagMSG * 0x00417848 {msg=0x00000202 wp=0x00000000 lp=0x0007001d}) line 665 + 18 bytes
CWinThread::PumpMessage() line 841 + 30 bytes
CWinThread::Run() line 480 + 11 bytes
CWinApp::Run() line 400
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001f24de, int 1) line 49 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001f24de, int 1) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 77881174()
NTDLL! 77ccb3f5()
NTDLL! 77ccb3c8()
sa inteleg ca tot la AfxAssertValidObject e baiu ?

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 » 26 Aug 2011, 22:02

mesajflaviu wrote:... sa inteleg ca tot la AfxAssertValidObject e baiu ?
Nu, nu la AfxAssertValidObject e baiul, el saracul doar iti spune ca-i bai (ai un pointer care-ti arata cu degetul spre balarii).
Doar de curiozitate: daca stergi SaveAllModified, tot crapa?

Din nou: zic sa-ti pui SP5 si mai discutam dupa aceea. Daca n-o fi asta cauza, oricum nu strica.

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

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?

Post by mesajflaviu » 26 Aug 2011, 23:21

SaveAllModified(); nu face probleme. Se pare ca, virgula, combinatia dintre :

Code: Select all

	CloseAllDocuments(FALSE);

	CWinApp::OnFileOpen();
face probleme ... oricare din linia de mai sus o comentez, nu mai am eroare de assert ... normal, nici nu mai face ce trebuie codul ... o sa instalez maine un SP, sa vad ce rezolv atunci ... multumesc mult pentru indrumari ... si rabdare.
Last edited by mesajflaviu on 27 Aug 2011, 08:29, edited 1 time in total.

Post Reply