Dialogs in DLL

WEBINAR: On-demand webcast

How to Boost Database Development Productivity on Linux, Docker, and Kubernetes with Microsoft SQL Server 2017 REGISTER >

It is nice to be able to make a DLL project that includes its own resources (such as a dialog resource) and then be able to call it from another project. Seems simple but I wnet nuts untill I found out the following:

In the DLL function that pops up the dialog you must manage the state so that the DLL code uses the DLL's resources.

extern __declspec(dllexport) void ShowEditDialog(int &MyData1, int &MyData2)
{
	//ensure we are using our own resources
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CMyLocalDialog dlg;
	dlg.Arg1 = MyData1; //specific local data for MyLocalDialog
	dlg.Arg2 = MyData2;
	dlg.DoModal();
	MyData1 = dlg.Arg1; //data after processing
	MyData2 = dlg.Arg2;
}

Here's an update sent in by Johan Nilsson

The program calling this exported function will never be able to use the function GetLastError() to check for problems that may have occured (I know it from experience). This is because the AFX_MANAGE_STATE macro creates a temporary object on the stack which, when it is automatically destroyed on function exit, will clear any error codes set for the current thread (it calls into TlsGetValue, deep in MFC).

I've provided a workaround for this, which I've been using myself. Not so pretty, but it works. Example on how to fix the ShowEditDialog fn :

extern __declspec(dllexport) void ShowEditDialog(int &MyData1, int &MyData2)
{
	DWORD dwLastErr = NO_ERROR;

	//
	// surround the code in brackets, which will cause the temporary
	// object created by AFX_MANAGE_STATE to be destroyed before leaving
	// the exported function.
	//
	// NOTE : Do NOT call MFC code outside of these brackets.
	//
	{
		AFX_MANAGE_STATE(AfxGetStaticModuleState());
		CMyLocalDialog dlg;
		dlg.Arg1 = MyData1; //specific local data for MyLocalDialog
		dlg.Arg2 = MyData2;
		dlg.DoModal();
		MyData1 = dlg.Arg1; //data after processing
		MyData2 = dlg.Arg2;

		//
		// save possible errors
		//
		dwLastErr = ::GetLastError();
	}

	//
	// only set error if none is currently set.
	// (last error will always be NO_ERROR _unless_
	// TlsGetValue failed earlier)
	//
	if (::GetLastError() == NO_ERROR)
		::SetLastError(dwLastErr);
}



Comments

  • aaagh, the dialog does not appear

    Posted by matthew_b067 on 06/23/2005 04:18am

    i tried the above... i put a breakpoint in OnPaint to barely see the dialog, but normally i cannot see the dialog, the app loses its control, i have to kill the app by taskmanager. HeLp mAtHaI

    Reply
  • Well documented in MSDN

    Posted by PadexArt on 01/13/2005 05:39pm

    In the MSDN index go to "Regular DLL" topic and select "Regular DLLs Dynamically Linked to MFC" subtopic. Quote: { When building a regular DLL that dynamically links to MFC, you need to use the macroAFX_MANAGE_STATE to switch the MFC module state correctly. This is done by adding the following line of code to the beginning of functions exported from the DLL: AFX_MANAGE_STATE(AfxGetStaticModuleState( )) The AFX_MANAGE_STATE macro should not be used in regular DLLs that statically link to MFC or in extension DLLs. For more information, see Managing the State Data of MFC Modules. }

    Reply
  • Thank you!

    Posted by Tandy on 07/24/2004 07:37am

    I really went nuts, when I tried to use and popup a DialogWindow in a dll.
    Normally I tried to do it simply as I do in an application by:
    CMyDialogWindowClass myDlg;
    myDlg.DoModal();
    I went nearly crazy.
    
    All I had to include on top was:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMyDialogWindowClass myDlg;
    myDlg.DoModal();
    
    That was all...
    
    Thank you for your help!
    
    CIAO Andreas

    Reply
  • If you get assert failures when calling DoModal, read this

    Posted by jgrieger on 03/26/2004 07:07pm

    Stumbled upon this which may or may not help: http://support.microsoft.com/default.aspx?scid=kb;EN-US;194300

    Reply
  • My regular MFC DLL with OCX control does not show!! Please HELP!!

    Posted by Legacy on 01/07/2004 12:00am

    Originally posted by: Sherri

    IS it possible to use OCX object in MFC created regular DLL ? I checked the main executable program which has "AfxEnableControlContainer();" in InitInstance() .
    The dialog box called from dll function still does not show. Please help!!! My both simple dll and exe programs are generated by MFC AppWizard. I can attach my simple program. Thanks for any help!!!

    Reply
  • How to import a Outlook.dll in a Visual C++ Project

    Posted by Legacy on 06/26/2003 12:00am

    Originally posted by: angelo xeno

    If you have a idea ?
    
    but i'm not found a solution
    it's possible to call a dll with this name ?
    thank's for help

    Reply
  • Debug assertion failed at DoModal() in debug mode

    Posted by Legacy on 06/12/2003 12:00am

    Originally posted by: Uli

    Hi!

    I've tried to add dialogs to my program by this way but I always get "debug assertion failed"-errors when executing DoModal() in debug mode. Some months ago I had a similar problem which could be solved by changing the compiler settings. I've tried this also but it didn't work.

    I've read the other comments and it seems to me I'm not alone with this problem. Has anyone a solution for this problem?

    Greetings!

    Uli

    Reply
  • HELP~~~~~~ SOS!!1

    Posted by Legacy on 04/16/2003 12:00am

    Originally posted by: Zidane22

    I don't know how to invoke the dialog in dll yet! Could you send me the code, thanks!

    Reply
  • load a child dialog from dll?

    Posted by Legacy on 02/12/2003 12:00am

    Originally posted by: dawo

    How can I load a child dialog from an dll and display it in an exe projekt as child????

    does anyone have a sample project????

    EMail: dawo.office@gmx.net

    thanks!!!!!

    Reply
  • MFC Dialog in IE Toolbar crash

    Posted by Legacy on 12/20/2002 12:00am

    Originally posted by: Vincent Sweeney

    I have a problem with showing dialog boxes from inside a MFC based IE Browser Helper Object DLL.

    I have a CToolBarCtrl class that when it receives a OnCommand call for cetrain icons needs to show a Modal dialog box. Whenever I try to show ANY CDialog based class I get an IE crash as follows:

    --

    void MyIEBar::ShowDialog()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMyDialog dlg;
    dlg.DoModal(); // <= crash
    }

    Tracing into the crash it is the MFC source at line:

    int CWnd::RunModalLoop(DWORD dwFlags)
    .
    .
    .
    // pump message, but quit on WM_QUIT
    if (!AfxGetThread()->PumpMessage()) // <= here

    --

    Does anyone know the issue?

    Reply
  • Loading, Please Wait ...

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Chuze Fitness is a fast-growing fitness chain with over 21 locations spanning California, Arizona and Colorado. Chief information and marketing officer, Kris Peterson, explains why access to fast and reliable Wi-Fi is a "must have" service at their gyms and why they switched to Ruckus Cloud Wi-Fi. Chuze Fitness needed to provide a good user experience to the hundreds of guests streaming music, podcasts and videos as they worked out. They also needed to adequately cover their sprawling 20-40,000 square foot …

  • Analytics in the cloud democratize the ability of developers and non-technical business users alike to put ever-expanding data universes to work. Download this eBook to learn how to plan and build a cloud-based enterprise analytics platform, tune that environment to meet changing business requirements, and maximize the TCO benefits of moving analytics to the cloud.

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date