Page 2 of 3
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 25 Aug 2011, 23:35
by Silviu Ardelean
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.
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 07:57
by mesajflaviu
Hmm ... in VC6 da eroare de assert la appui1.cpp line 215 ... ciudat ...
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 08:19
by Silviu Ardelean
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...
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 08:31
by Ovidiu Cucu
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.
VS6.0 - SP5
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 08:41
by mesajflaviu
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
}
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 10:58
by Ovidiu Cucu
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.

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 11:37
by Silviu Ardelean
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.

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 12:02
by Ovidiu Cucu
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".

Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 13:20
by mesajflaviu
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 ...
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 13:26
by mesajflaviu
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);
}
}
}
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 13:43
by mesajflaviu
Cum as putea gasi implementarea clasei CWinApp (fisierul cpp) ? Header-ul l-am gasit in afxwin.h cu F12 ...
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 14:06
by Ovidiu Cucu
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...
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 16:50
by mesajflaviu
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 ?
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 22:02
by Ovidiu Cucu
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.
Re: Cum inchid documentele la OnFileNew si OnFileOpen ?
Posted: 26 Aug 2011, 23:21
by mesajflaviu
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.