Destroying the Modal Property sheet
Ram Kumar K.Thalanki -- vatram@m-net.arbornet.org Thursday, May 30, 1996 Hello everybody, MSVC 4.0 ; MFC 4.0 ; Win 95 I have an application with more than one frame window. From one of the = frame windows, I am calling DoModal() of CPropertySheet derived class. At some point of = time, in another frame window, I get a pointer to this property sheet = and from that window, I want to destroy the property sheet when it is = still in it's modal loop.=20 I tried calling EndDialog(TRUE), DestroyWindow(), sending/posting = message to that property sheet, PressButton(PSBTN_CANCEL) and 'delete' = on the property sheet C++ object. The property sheet is getting = destroyed and I'm getting access voilation message and it is coming to=20 if (!ContinueModal()) goto ExitModal; (line 3573 in wincore.cpp) I'm not able to make out what out what is happening. I am stuck up. = Please help me. Thanks, Ram Kumar
Paul Pettigrew -- chilli@iinet.net.au Monday, June 03, 1996 [Mini-digest: 2 responses] Ram Kumar K.Thalanki[SMTP:vatram@m-net.arbornet.org] wrote: >Hello everybody, > >MSVC 4.0 ; MFC 4.0 ; Win 95 > >I have an application with more than one frame window. From one of the = frame windows, >I am calling DoModal() of CPropertySheet derived class. At some point = of time, in another frame window, I get a pointer to this property sheet = and from that window, I want to destroy the property sheet when it is = still in it's modal loop.=20 > >I tried calling EndDialog(TRUE), DestroyWindow(), sending/posting = message to that property sheet, PressButton(PSBTN_CANCEL) and 'delete' = on the property sheet C++ object. The property sheet is getting = destroyed and I'm getting access voilation message and it is coming to=20 > > if (!ContinueModal()) > goto ExitModal; > (line 3573 in wincore.cpp) > >I'm not able to make out what out what is happening. I am stuck up. = Please help me. > >Thanks, > >Ram Kumar Assuming your pointer to the dlg is valid, you may like to try the = method that I have employed. Basically, you are programatically tring to perform the equivalent of = the user clicking on the OK button. Go to the .H file for your dlg, and place a public access function as = follows public: void DoOk(); in your .CPP, place this void CMyDialog::DoOk() { // Call protected, framework default handler. OnOk(); } All there is to it! -- Paul Pettigrew chilli@iinet.net.au || pmpet2@mugc.cc.monash.edu.au http://www.iinet.net.au/~chilli/ -----From: "David W. Gillett"My hunch is that the only way this can be happening at all is if each of your frame windows has its own thread, right? That could be important (but maybe not -- read on). I'd pick PressButton(PSBTN_CANCEL) as the safest approach. All of the others should eventually be called in the process of handling this; my preference is to let the framework orchestrate that. ... My original hunch was that this was going to be an issue of cross-thread handle-mapping, but checking out the MFC sources for ContinueModal(), I have another theory: Are you, perhaps, deriving your own class from CPropertySheet and making your CPropertyPage-derived objects members of that class? This is unnecessary, and may be the actual problem. The CPropertySheet destructor may be trying to invoke CPropertyPage::ContinueModal() against the current page, an object destroyed as part of the sheet-derived class's destructor. Oops. There are cases where it is necessary and useful to derive a class from CPropertySheet, but they're the exception rather than the rule. The CPropertyPage objects should not be members of such a derivative class. They could be members of the owning frame class, or its associated document or view. Dave
| Вернуться в корень Архива |