|
Jason Henderson wrote:
Thanks, but it didn't work.
Ouch, that's strange. I though if you would add to your catch block catching CSeExcpetion, then you will catch all SE exceptions and you should be able to get address of it (them).
OK, another way, I guess you can debug your code. Start debug session. Change the handling of all exceptions from 'Stop, if not handled' to 'Stop always' just before your problem usually occurs. Then debugger will jump directly to place where it has happened.
|
|
|
|
|
Jason Henderson wrote:
Thanks, but it didn't work.
Did you execute _set_se_translator(SeTranslator) in your application startup code and catch the exception by using catch(CException * e) in the catch block before the catch(...) block?
John
|
|
|
|
|
Yep, did all that.
I'm not sure if my app is even causing the problem right now.
Like it or not, I'm right.
|
|
|
|
|
Hi,
I have an MDI Application, and in that I have created the worker thread. From the worked thread I want to access the "Document" class of the MDI Application. Whenever I try to do GetMainWnd() and from that try to get the document, using GetActiveDocument() I am gettting an error.
This is the few lines of code :
CMyApp *app = (CMyApp *)AfxGetApp();
CMDIFrameWnd *pMain = (CMDIFrameWnd *)app->GetMainWnd();
CMyDoc *pDoc = (CMyDoc *)pMain->GetActiveFrame()->GetActiveDocument();
Can someone tell me my error???
Thanks in Advance...
Arthi
|
|
|
|
|
To make a long story short, it is not safe to retrieve CWnd objects belonging to another thread. There are several possible workarounds:- Enable a user-defined message in your UI thread that retrieves the active document (basically move your code to the message handler) and call it from the worker thread with
SendMessage . This can pose some deadlock problems, though. - Pass the worker thread a pointer to the document on launch time (using the extra parameter at your disposal.)
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I use method 2 very much in my applications and it works good. However as pointed out MFC declares its maps in a per thread basis so if you create a view \ CWnd in a different thread than the main application thread you will probably run into many problems especially with removing the view. This problem almost made me move over to WTL / ATL but I was able to modify my application so that all views were created by the main thread.
John
|
|
|
|
|
arthivjii wrote:
From the worked thread I want to access the "Document" class of the MDI Application.
You should never do that! Never touch the GUI object from a different thread! If you step into the code you will see it crashes in the AssertValid function. Here are the comments from the MFC sources:
You should post a message to the main window instead. For better understanding of the worker threads read Using worker threads
Best regards,
Alexandru Savescu
|
|
|
|
|
Hi,
Thanks a lot for the suggestions. I have now understood the mistakes which I was doing.
Thanks
Arthi
|
|
|
|
|
Alexpro wrote:
You should never do that! Never touch the GUI object from a different thread!
I can't agree with you here. There are lots of pitfalls doing GUI stuff from a Worker Thread but it is mostly all doable. The main problem is that MFC's handle map's are maintained on a per thread basis, so your worker thread can't access the CWnd from another thread. It still can use the hWnd to do GUI stuff and also under some circumstances use CWnd's.
I have a simple class I've written which attachs a CWnd* to the current worker threads message map. It is similar to CWnd::Attach() and resolves the MFC problems with ASSERT_VALID( this ). I make use of these techniques in ED for Windows (see sig), which uses threads extensively. If anyone wants a copy let me know.
Neville Franks, Author of ED for Windows. www.getsoft.com
|
|
|
|
|
How (if possible) can you make a dialog app that can take command line parameters like a console app?
==================================================
Homepage: www.onyeyiri.co.uk
Email: theeclypse@hotmail.com
"I think Microsoft has invented A.I. My computer has a mind of its own!"
|
|
|
|
|
simple: just use _argc and _argv in your CWinApp's InitInstance, before the DoModal call that starts the dialog. use them just as you would use argv and argc in a command line app.
-c
Cheap oil. It's worth it!
|
|
|
|
|
Do anyone know how to do this?
I tried CertOpenSystemStore with name "Other People", but could not get the certificate. It created another store with the same name. Now when I enumerate stores, I get two "Other People" stores.
Thomas George
modified 29-Aug-18 21:01pm.
|
|
|
|
|
ok.. part of my data validation on a dialog of mine checks to make sure a field isn't blank, if so the datavalidation fails and gives an error.. so heres my problem..
i have a button in the dialog which pops up another dialog and lets then choose a city in a state, when they hit ok it fills out some fields in the main dialog with the values from the citystate dialog.. like this..
UpdateData(true);
CCityStateDlg dlg;
if (dlg.DoModal() == IDOK)
{
m_strCity = dlg.m_strCity;
m_strState = dlg.m_strState;
UpdateData(false);
}
my problem is that when UpdateData(true); gets called in the begining it causes my errors for blank fields to get called.. but if i don't call it then when i call UpdateData(false); it clears out the other fields in the dialog because the values in the fields were never put in the variables..
so is it ok to do this?
CCityStateDlg dlg;
if (dlg.DoModal() == IDOK)
{
CEdit* pCity = (CEdit*)GetDlgItem(IDC_CITY);
CEdit* pState = (CEdit*)GetDlgItem(IDC_STATE);
pCity->SetWindowText(dlg.m_strCity);
pCState->SetWindowText(dlg.m_strState);
}
and if so does that mean that UpdateData is pointless, or is it just not possible to use in this situation? Basicly i don't want to give the user the errors about blank fields when they click the button because they may fill out these other fields after they choose the city/state..
thanks for the help!
-dz
|
|
|
|
|
I'd say your proposed solution is fine, given the constraints of your design. Ideally, you only call UpdateData(FALSE) when pressing the "Accept" button --during the lifetime of the dialog the data are supposed to inhabit the controls, and only at exit time are they transfered to the appropriate member variables.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
This is a little off-topic from your question and is a design issue instead, but why don't you use dropdown listboxes for city and state? Then you wouldn't have to deal with a second dialog.
|
|
|
|
|
Welp, i use the dialog in multiple places, and i haven't taken the time to figure out how to place a propertypage into a static frame inside of a dialog.. basicly i need to reuse this state/city picker in a few different dialogs for different reasons.. but it would be nice if it was just listed there.. maybe in a future version
-dz
|
|
|
|
|
Welp, i use the dialog in multiple places, and i haven't taken the time to figure out how to place a propertypage into a static frame inside of a dialog (although ive seen it done in SPAPrefs on CP).. basicly i need to reuse this state/city picker (which does use dropdown listboxes) in a few different dialogs for different reasons.. but it would be nice if it was just listed there.. maybe in a future version
-dz
|
|
|
|
|
dazinith wrote:
so is it ok to do this?
Yes it is ok to do that.
dazinith wrote:
and if so does that mean that UpdateData is pointless, or is it just not possible to use in this situation?
No you could have set a boolean and checked it in your DoDataExchange and used its value to bypass the data validation routines. UpdateData is not pointless it saves you from having to get, set and validate the dialog data yourself. I usually have several conditionals and some GetWindowText() and SetWindowText() in the DoDataExchange() and call UpdateData(TRUE) and UpdateData(FALSE) several times in my complex dialogs.
John
|
|
|
|
|
Hello, I'm using VC++v6.
When I'm debugging, I cannot view any variable values in the watch window when I step through e.g.
NAME m_PathName
VALUE CXX0017:Error: symbol "m_PathName" not found
The variable is in scope and initialised, and i'm definately in debug mode. My variables window is also empty. I have used them successfully before but I can't figure out why not now.
Can anybody help, thanks,
John
|
|
|
|
|
Make sure you have the "Debug info" option switched on. If that doesn't work, exit VC++, delete all .ncb, .opt, .plg, .pch and .pdb files in your project and try again.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Hi,
I was wondering how could I dynamically add an item to a menu (or how to add a menu dynamically).
I appreciate your help.
Thanks.
|
|
|
|
|
Hi,
I believe the MSDN library discs have a sample called DYNAMENU that shows how to dynamically add items to a menu.
Hope that helps,
Lan
|
|
|
|
|
Use CMenu::InsertMenu
Best regards,
Alexandru Savescu
|
|
|
|
|
Use InsertMenu()
BOOL InsertMenu(
HMENU hMenu, // handle to menu
UINT uPosition, // item that new item precedes
UINT uFlags, // options
UINT_PTR uIDNewItem, // identifier, menu, or submenu
LPCTSTR lpNewItem // menu item content
);
|
|
|
|
|
How can I send EMails from an MFC Project without MAPI functionality and without Doc/View Architecture???
Please send me some source Code!!!!!
|
|
|
|