|
Why is it that when the following code is executed, the first dialog comes up and waits 'til the user clicks OK, but as soon as the second dialog comes up, the whole app abruptly shuts down without waiting for any interaction from the user?
BOOL CNuFunkApp::InitInstance()
{
CNuFunkDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
CNuFunkDlg dlg2;
m_pMainWnd = &dlg2;
int nResponse2 = dlg2.DoModal();
return FALSE;
}
|
|
|
|
|
Because you are creating a modal dialog box. What you need is a modeless dialog box. See the C++ FAQ, I think it was mentioned in there.
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
No, I'm pretty sure I want "Modal" behavior. What I would expect in this simplified example, is that the first dialog would come up and wait in a modal state until the user dismisses it, after which, the second dialog would come up and wait in a modal state until the user dismisses it, at which time the app would then shut down.
|
|
|
|
|
I missunderstood your point, hm...
Well, I would show these two dialogs in OnInitDialog() if I were you... but that's perhaps a bad code design, I don't know. If you do it in OnInitDialog() it WILL work.
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
Your application actually exits upon return from:
int nResponse = dlg.DoModal();
This is because of the previous line:
m_pMainWnd = &dlg;
Searching in the MSDN documentation reveals:
The Microsoft Foundation Class Library will automatically terminate your thread when the window referred to by m_pMainWnd is closed. If this thread is the primary thread for an application, the application will also be terminated. If this data member is NULL, the main window for the application's CWinApp object will be used to determine when to terminate the thread. m_pMainWnd is a public variable of type CWnd*.
Typically, you set this member variable when you override InitInstance. In a worker thread, the value of this data member is inherited from its parent thread.
-Sean
----
Shag a Lizard
|
|
|
|
|
Thank you very much for solving my mystery.
jer
|
|
|
|
|
I had the same problem once. After a lot of looking around I found out that the WM_QUIT message from the first dialog box gets left in the message queue. When I emptied the message queue between the calls, (or at least the WM_QUIT message) things worked fine.
Write back and let us know what you find in your case.
|
|
|
|
|
I'm working on a project using a MFC dialog-based application, though the problem lies elsewhere. I seem to be having stray data coming into some arrays i use, an array which is populated once and then left alone for reference. Even worse, there seems to be problem with where i declare my arrays in the header file. Declaring it 2 lines before, makes a difference and puts the program into a never ending loop. This seems very strange. I spoke to friend of mine and he said it happened to him but he could'nt figure out why. Although my problem seems to be a lot more severe. Has anybody else had similiar stray array errors before? it's completely negating the task and my deadline is a week away.
I tried adding extra blocks to my array and this helped cutting down some stray data, i.e declaring an array[140] as array[150], and now if i put the array back to [140] it hangs the program as well, so its definately making a difference.
Please Help!
Ayush
|
|
|
|
|
Post an example of the declaration and how you assign the array and access it.
Kuphryn
|
|
|
|
|
Just in the straightforward/primitive way
int used_nodes[142][2];
int instructions[24][140];
etc..
They're all accessed using loop variables, which are local so they are not shared. The array are declared under private: in the header file. If i declare the 'instructions' array before 'used', i get an access violation. If i do it the other way round, some parts of 'instruction',namely 3 parts, seem to get filled with data of the used array. Moving any array about in the header file like so causes an access violation..
|
|
|
|
|
I believe the one or more of the loops try to access and/or modify an index that is out of bound. Recheck all loops.
Do you do some math using on the integer used to access the array, i.e. int i = something * something1 - something2?
Kuphryn
|
|
|
|
|
Weird. The case of order of declaration is weird. As an experiment, declare both arrays as global. Test your loops.
Kuphryn
|
|
|
|
|
I'm guessing that you are going out of bounds on the end of one of the arrays. When strange problems start to have "solutions" like moving variables around, and you are using arrays, ALWAYS make sure you aren't going out of bounds on the array.
From the clues you've given, I'm betting 90% that you are going out of bounds on the used_nodes array. When you go out of bounds on it, if you have it before the instructions array, you are simply stomping on the instructions array. If you swap the order of declaration, you are modifying whatever variable comes next in your class. Or, if your class doesn't have any more members, you are modifying somebody else's data.
Chris Richardson
C/C++ Include Finder[^]
|
|
|
|
|
Thanks guys,
I guess i'll have it to look thru it again, from what i recall, most of my arrays are called from a fixed for loop so i don't know how there could be data going out of bounds. Although, i can see data being changed in an array while debugging, but i dont know where it came from. Is there any possibility of finding out what causes the change of value of a variable from the debugger, i.e. which line of code?
Cheers.
Ayush
|
|
|
|
|
It's possible to set "Data" breakpoints with VC6. Try to look it up in the MSDN (I'm not on my Dev Machine or I would). It's a little tricky, but it will definately do what you want. What it basically allows you to do, is have a breakpoint hit when some code stomps off the end of the array. If you want some more info, I'll post more tomorrow when I'm back on my dev machine.
Chris Richardson
C/C++ Include Finder[^]
|
|
|
|
|
Does anyone know if there are any c++ examples of parsing date/time from rfc822/1123 email message headers on the net?
(I've done much hunting for this but can't seem to find an actual snippet or source and I don't want to re-invent the wheel)
|
|
|
|
|
all u need is a regular expression engine or even a simple tokenizer class will do the job do u have either of those?
"No matter where you go, there your are..." - Buckaoo Banzi
-pete
|
|
|
|
|
No I don't, but I know that's how it's done in the perl world etc.
I was hoping to avoid all that and find a function in straight c or c++; the problem is that there are variants of the way that date is presented according to the docs I've been reading and it's not uncommon for an algorithm to handle that to have some "finagling" built into it, so rather than re-inventing the wheel...
|
|
|
|
|
>> No I don't
u don't have a simple string tokenizer class? how the heck do you get anything done?
>> so rather than re-inventing the wheel...
just say i said it was ok, this one time!
"No matter where you go, there your are..." - Buckaoo Banzi
-pete
|
|
|
|
|
Search for getdate.y. It's an RFC compliant parser written in Yacc. Generate C-code by running bison on it.
Gisle V.
"If you feel paranoid it doesn't mean they're not after you!" -- Woody Allen
|
|
|
|
|
Looking for your opinion on what is the easiest XML class that supports commenting? ie: <example help="a lot">
Thanks
Darroll
Never tell people how to do things. Tell them what to do and they will surprise you with their ingenuity.
- General George S. Patton
|
|
|
|
|
|
Ok here's the code
hdrop = (HDROP) ::GlobalLock ( hg );
if ( NULL == hdrop )
{
::GlobalUnlock ( hg );
return;
}
uNumFiles = ::DragQueryFile ( hdrop, -1, NULL, 0 );
for ( UINT uFile = 0; uFile < uNumFiles; uFile++ )
{
// Get the next filename from the HDROP info.
if ( DragQueryFile ( hdrop, uFile, szNextFile, MAX_PATH ) > 0 )
{
// get the orginal filename and determine if the the extension is upper case or
// lowercase.
origfile = szNextFile;
origfile.Delete(0,(origfile.GetLength() - 4));
BOOL isUpper = ::isupper(origfile[1]);
// Now do the rest.
if ( file.Open( szNextFile, CFile::modeRead) ){
CFileFind fileFind;
if ( fileFind.FindFile ( (path + _T("\\") + file.GetFileTitle() ),0) ){
CString temp = file.GetFileTitle();
makes sense right? get access to the clip board, get the file list from the clip board and loop through the file list, getting the file. My problem is that the file.Open function returns a file name that is all Capital letters when getting the information from a media drive (read CDROM). So if a file is lowercase it the file.Open will automatically convert the filename to uppercase.
This is unacceptable becuase now the file that I copy over is no longer the same file
Any ideas
Dan Willis
|
|
|
|
|
Filenames are not case-sensitive in Windows, so if you're relying on a particular case, then your code is incorrect.
But to answer your question, the filename is all uppercase because that's how ISO9660 stores names (it has a limited set of allowable characters). It would be the same if the source partition were FAT16.
--Mike--
The Internet is a place where absolutely nothing happens.
-- Strong Bad
1ClickPicGrabber - Grab & organize pictures from your favorite web pages, with 1 click!
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Mike,
Thanks for the prompt reply. That makes sense. My problem is that people are complaining that when they copy stuff from the CDROM to somewhere else, the filename changes from say lowercase to upper case. Unfortuately I have to come up with a solution. Do you have any suggestions?
I'm not dependent on the "case" of the file name, but the inconsistancy is getting me in trouble
Thanks alot. Starting to make sense now.
Dan Willis
|
|
|
|