|
Thanks Steve,
1. You mean catch(...) is not the standard way to catch structured exception and we should use __except instead?
2. How about try? The same as catch(...) for backward compatibility? And we should use __try instead?
regards,
George
|
|
|
|
|
These are difficult questions. As I pointed out earlier, the C++ keyword catch should only catch exceptions explicitly thrown by a C++ throw statement, according to the C++ standard. The ability to catch SEH exception using the C++ catch statement is switchable in later versions of MSVC, although you’re stuck with the non-standard behaviour using MSVC6. Microsoft’s SEH mechanism, accessed in C++ (on Microsoft and compatible compilers) via the __try and __except[^] keywords, is Microsoft specific but then again so is the ability to catch these exceptions using the C++ catch statement. Also note that __try and __except[^] does not result in destructors being called as the stack is unwound, so it doesn’t place nice with C++ in many cases.
Steve
|
|
|
|
|
Hi Steve,
From the link, I have not found the statement you mentioned "__try and __except[^] does not result in destructors being called as the stack is unwound".
So, RAII model can not work with structured exception?
regards,
George
|
|
|
|
|
George_George wrote: So, RAII model can not work with structured exception?
Exactly.
Steve
|
|
|
|
|
Hi Steve,
Sorry for asking this question again.
I re-read your statement below agian,
--------------------
Also note that __try and __except[^] does not result in destructors being called as the stack is unwound, so it doesn’t place nice with C++ in many cases.
--------------------
Should it be __try and __except which block us from stack unwinding or more exactly should say structured exception blocks us from stack unwinding?
(I have this confusion because in Visual Studio we still can use catch to catch structured exception.)
regards,
George
|
|
|
|
|
Hi Steve,
Sorry for interrupting you again. I have tested that structured exception could also trigger stack unwinding, looks like either you are wrong or my understanding is not correct?
Here is my code,
#include <iostream>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "constructing Foo" << endl;
}
virtual ~Foo()
{
cout << "destrucing Foo" << endl;
}
};
int main()
{
int* address = NULL;
try{
Foo foo1;
(*address) = 1024;
} catch (...)
{
cout << "access violation caught" << endl;
}
return 0;
}
</iostream>
Output:
constructing Foo
destructing Foo
access violation caught
regards,
George
|
|
|
|
|
Hi everybody,
in my MDI Project i create a Dialog-Window and open it with DoModal
The user hit's a key, the Dialog closes (via OnOK())
And if the stroken key isn't the correct one, i reuse the instance of the dialog
and call DoModal() a second time...
So far so good
Between OnOK() and the DoModal() the Dialog closes and disappears from the screen and reappears,
which is normal
But i like to freeze the display during this traitement, so that the user don't sees the Close-ReOpen
Any ideas?
Big thanks for help!
|
|
|
|
|
baerten wrote: Any ideas?
Check the key pressed *before* you close the dialog, and keep it open if it is wrong?
Iain.
|
|
|
|
|
Yes, normally it's the correct way to do this
But i need to step out the DoModal() (return to the function which calls the DoModal())
I created a Wrapper-Control which is called as the same way in windows-logic as in DOS-Console-logic
and in dos i have the following:
while(stop != 1) {
Grid.Execute();
switch(Grid.PressedKey) {
case KEY_ESC: stop = 1; break;
case KEY_ENTER: stop = 1; break;
};
}
I need to do this, because i reconstruct a DOS-Console Project into MFC
And both source-codes still exists (the DOS-Application should still exist after the MFC Application is ready)
So i need a source-code which can be traited in each logics
Because to adapt some 100000 lines of code isn't so cool
This "amphibian" source-code works, but i try to get it more beautiful
Thanks anyway for your answer
|
|
|
|
|
baerten wrote: switch(Grid.PressedKey) {
case KEY_ESC: stop = 1; break;
case KEY_ENTER: /*traitement*/ stop = 1; break;
}
Coding horror candidate?
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
Unfortunately yes
See my explain deeper
|
|
|
|
|
baerten wrote: But i need to step out the DoModal() (return to the function which calls the DoModal())
You can't do this AND have the dialog remain open. Pick one or the other.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Don't ask such simple/silly questions.
Come online at:-
jubinc@skype
|
|
|
|
|
|
Plzz don't spam by asking such questions.
Come online at:-
jubinc@skype
|
|
|
|
|
What are you doing dismissing and domodal ing the dialog? Why don't you validate the key that was pressed in your dialog's <code>OnOk() ? I think you are trying to do it the wrong way.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
|
I explained it to Iain Clarke:
Yes, normally it's the correct way to do this
But i need to step out the DoModal() (return to the function which calls the DoModal())
I created a Wrapper-Control which is called as the same way in windows-logic as in DOS-Console-logic
and in dos i have the following:
while(stop != 1) {
Grid.Execute(); //-> does the DoModal() and quits this function via the OnOK()
switch(Grid.PressedKey) {
case KEY_ESC: stop = 1; break;
case KEY_ENTER: /*traitement*/ stop = 1; break;
};
}
I need to do this, because i reconstruct a DOS-Console Project into MFC
And both source-codes still exists (the DOS-Application should still exist after the MFC Application is ready)
So i need a source-code which can be traited in each logics
Because to adapt some 100000 lines of code isn't so cool
This "amphibian" source-code works, but i try to get it more beautiful
Thanks anyway for your answer
It's only the way to reuse the DOS-SourceCode and not to recode all the sourcecode in a Windows-logic
Otherway i made it naturally in your given way.
Because it's not so easy to my to create MFC-controls which works like a "DOS-Console-Control"
|
|
|
|
|
I already read your reply to him, but my point was that you were trying to achieve something in an unusual way. May be your situation demands you to do so. I haven't done something like that.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
yes, so it is
In school i made it in the correct windows-programmation-logic
But in work, were the DOS-Application should still life a double-code is not so good
Because during i recode the application to MFC the DOS-applic still grows
So all newer code should be integrated itselfs, with this kind of "wrapper logic"
But to my question:
Is it possible to freeze the display between a OnOK() and a DoModal()
so that the user don't sees the closing and re-opening?
Thanks
|
|
|
|
|
That can be done easily. Override PreTranslateMessage() of the Dialog (which is being shown on DoMOdal()) and handle WM_KEYUP/WM_KEYDOWN. This way u'll get the key.
Come online at:-
jubinc@skype
|
|
|
|
|
Thats totally correct, but in this case i'm in a source-code of the real MFC code
I need to copy the whole source-code of all cases of keystrokes to this MFC-Class
So i have a double source-code.
If the A-Key does create a new customer and the D-Key deletes a customer for example
i create this code in my class
If my colleague changes the source-code of the DOS-Application i need to change aswell the
source-code of the MFC-Class, that's pretty impractical. All work has to be done twice.
In my horror-code the DOS-Programmer changes simply the code in his DOS-way and the code also
changes in the MFC-logic...
It know, it's hard to understand why i do this, but it's really the onliest way to re-create
an application which contains over 2000000 lines of code and will also grow up during i code...
So i need simply an idea how to resolve my problem, however my kind of programmation is stupid or horrible
|
|
|
|
|
In my horror-code the DOS-Programmer changes simply the code in his DOS-way and the code also<br />
changes in the MFC-logic...
Here what does DOS-way mean? And how the changes are reflecting to the MFC code?
Come online at:-
jubinc@skype
|
|
|
|
|
I have for example a simple source-code ( .cpp & .h file) without classes, only static functions.
These functions are called from the DOS-code and aswell from my MFC-Classes :
For example
while(stop != 1) {
Grid.Execute(); //-> does the DoModal() and quits this function via the OnOK()
switch(Grid.PressedKey) {
case KEY_ESC: stop = 1; break;
case KEY_ENTER: /*traitement*/ stop = 1; break;
};
}
In the DOS-Application the .Execute draws with a lot of printf a Grid to the console
In my MFC-Application the .Execute opens a Dialog within a Grid-Control
If the user hit's a key, the Execute function ends and the switch(Grid.PressedKey) launches
If the key don't matches, the grid continues beeing displayed, until ENTER or ESCAPE is beeing hitted.
In DOS a #ifndef loads the header which defines the DOS-Grid and in the case of a windows PRECOMPILER-DIRECTIVE the header
for the Dialog will be loaded...
So this code is uniform to the application ...
You know what i mean? Because it's hard to explain in a brief text a whole project-logic
Greetz
|
|
|
|
|
Hi..
I am calling a DLL Methods through Command Line.I am getting errors..It is not Connecting to server.plz help me..
Error is..
p(214) : error C2451: conditional expression of type 'void' is illegal
Expressions of type void cannot be converted to other types
Code...
ACL_STATUS *Acl_Status;
HINSTANCE hClcltr = LoadLibrary("ACL_API.dll");
CONNECION connect2Server;
connect2Server = (CONNECION)GetProcAddress(hClcltr,"ACL_ConnectToServer");
CString sBuf;
CHAR *buf = sBuf.GetBuffer(MAX_PATH);
GetSystemDirectory(buf, 256);
lstrcat(buf,"\\shell32.dll");
sBuf.ReleaseBuffer();
connect2Server(aConfig[1], aConfig[2], aConfig[0], aConfig[5],Acl_Status);
--->(Error) if(connect2Server(aConfig[1], aConfig[2], aConfig[0], aConfig[5],Acl_Status ))
{
AfxMessageBox(_T("Successful"));
//AfxMessageBox("Succesful");
}
FreeLibrary( hClcltr );
Hi,,
I am sharan.Working as a software Engineer in Indo-Fuji Software Company located in BTM Layout.Bangalore.India.
I have Completed my B.E(COmputers)in 2006.ANd I am having 2 years of Exp in VC++.
thanking you
sharan
|
|
|
|