Cum inchid documentele la OnFileNew si OnFileOpen ?
- Silviu Ardelean
- Senior
- Posts: 1175
- Joined: 12 Jul 2007, 09:22
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
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.
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Hmm ... in VC6 da eroare de assert la appui1.cpp line 215 ... ciudat ...
- Silviu Ardelean
- Senior
- Posts: 1175
- Joined: 12 Jul 2007, 09:22
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
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...
Oricum, SARI peste VS 2003. Compilatorul VC++ din 2003 e paf...
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Ce-i la tine in appui1.cpp la linia si pe langa?
La mine e asa.
Cea cu //////////-uri e linia 215.
VS6.0 - SP5
La mine e asa.
Code: Select all
CFrameWnd* PASCAL CCmdTarget::GetRoutingFrame_()
{
CFrameWnd* pFrame = AfxGetThreadState()->m_pRoutingFrame;
return pFrame;
}
/////////////////////////////////////////////////////////////////////////////

VS6.0 - SP5
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
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
}
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
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:
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.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
- Silviu Ardelean
- Senior
- Posts: 1175
- Joined: 12 Jul 2007, 09:22
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
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. 

- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Doua observatii colaterale:
[ off-topic ]
[ 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".
- Odata ce ai hendluit ID_FILE_NEW si ID_FILE_OPEN in aplicatie, sterge macro-urile alea pe care le-a pus wizard-ul:
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.Code: Select all
// Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
- 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 ]
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!".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.

[ 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".

Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
La mine linia 215 din appui1.cpp este aici :
e ciudat totusi, pentru ca daca dau 'Retry' debugger-ul ma duce asa cum am spus la OBJCORE.CPP cum am scris mai sus ...
Code: Select all
CFrameWnd* PASCAL CCmdTarget::GetRoutingFrame_()
{
CFrameWnd* pFrame = AfxGetThreadState()->m_pRoutingFrame;
if (pFrame != NULL)
ASSERT_VALID(pFrame); // <- linia 215 ...
return pFrame;
}
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
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);
}
}
}
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Cum as putea gasi implementarea clasei CWinApp (fisierul cpp) ? Header-ul l-am gasit in afxwin.h cu F12 ...
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
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...
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...
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Am fotografiat "call stack"-ul :
sa inteleg ca tot la AfxAssertValidObject e baiu ?
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()
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Nu, nu la AfxAssertValidObject e baiul, el saracul doar iti spune ca-i bai (ai un pointer care-ti arata cu degetul spre balarii).mesajflaviu wrote:... sa inteleg ca tot la AfxAssertValidObject e baiu ?
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.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
SaveAllModified(); nu face probleme. Se pare ca, virgula, combinatia dintre :
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.
Code: Select all
CloseAllDocuments(FALSE);
CWinApp::OnFileOpen();
Last edited by mesajflaviu on 27 Aug 2011, 08:29, edited 1 time in total.