Export dialogs in MFC Extension DLLs

It seems to be quite easy to export dialogs from mfc-extension dll's. Just export the corresponding class with AFX_EXT_CLASS and your done. If you do so with an application and a dll you create from scratch you probably even will succeed. But if you insert more and more resources in both the application and the dll, you will get some serious bugs. Here is the reason:

The regular way to identify a specific resource is its ID. This is an integer constant defined by the resource editor. Now say you have got a resource (which is a string) called ID_MY_TEXT.

Code like this prints the resource-string into the debug window. Sometimes you may get a wrong text and this happens only if the text is in a mfc-extension-dll (mfc-ext-dll). The reason for this error lies in the way the application gets a resource. Since both the application and the dll can have a resource file, IDs can be the same for different resources. (Which is very likely because the VC resource editor starts numbering the IDs at a certain value for each module.)

As you may guess the order the application searches for a resource is first in your application and afterwards in your dll(s) (and finally in the mfc-resources). We need to change the search order for resources.

There is another article on this site which deals with dialog exports from DLL's. But that (as far as I have tested) works only in regular-mfc-dlls.

I wrote a class that (with a little change in the dll main source file and the dialog) will enable you to freely call your dialog from wherever you want. Like:

CMyApp::OnDLLDialog()
{
CDLLDialog dlg;
dlg.DoModal();
}

As you see there is no need for an export function (which would not be very OO).

I wrote a simple class that sets the resource handle of the dll at its construction and sets back the previous handle at its destruction.

Copy the class texts from above into the files ExtDllState.h and ExtDllState.cpp. Put BOTH files in a public include directory where every project can reach it. In your DLL go to the main source file (which is named after the DLL). Here you find something like this:

static AFX_EXTENSION_MODULE MY_DLL_NAMEDLL = { NULL, NULL };

where MY_DLL_NAME your dll name is (:

Replace this variable name with "extensionDLL". Below this line put the following lines:

#include "EXTDLLState.h"
#include "ExtDllState.cpp"

Look for occurrences of MY_DLL_NAMEDLL in the rest of the file and replace it with extensionDLL. Occurrences can only happen in this file since the variable is static.

Now if you want to export a Dialog go into the source file of the corresponding class and include EXTDLLState.h again. Override the function DoModal() (Best done with the ClassWizard). You should get something like:

With this approach you got a comfortable way to export classes that use resources. Be aware that if you need resources in other places too, to define CEXTDLLState before use. (Especially this must be done with modeless dialogs!!!).

You can use CEXTDLLState everywhere you want to access resources in mfc-ext-dlls. You will always get the right thing. I hope this will help some of you, since I had some troubles till I found an easy and nice way to do handle this.

Nike Aura Max+instagram, will you contain the color to step on your feet!

Posted by madytreathy
on 04/24/2013 02:04pm

Remember in 2008, if not earlier, when Nike launched ahead of the independent shoe color projects, the watchword "Shoot Your Colours", "Nike PhotoiD" layout, [url=http://markwarren.org.uk/property-waet.cfm]air max 90 uk[/url]
reply has not been as fervent as expected. Have in mind, 2008 Canon IXUS 80 IS Digital prankster arcade but only 8 million pixels, Nokia, the motorized phone retail is the exclusively leadership, NikeiD was promote to color in the photos as a infrastructure quest of sneakers levy color, although provocative, but does trouble some.
Instagram which cause this thing hold up to ridicule and modest, Nike PHOTOiD homeopathic upgrade customization services, recently [url=http://fossilsdirect.co.uk/glossarey.cfm]nike huarache[/url]
released a strange plan. That such iD can you implement pictures as instagram account shoe color, little while volunteer Nike Aura Max shoes and Nike Puff Max 1, Nike Feeling Max 90 953 options. Interested in children's shoes, you [url=http://markwarren.org.uk/property-waet.cfm]air max 90 uk[/url]
can always conform with each other's official website photoid.Nike.com, in besides to skim through other people's ingenious sweat, or you can hear to upload your own instagram photo, base your own Nike Hauteur Max.

Assertion failute in Debug build

Posted by rahul.shukla
on 09/09/2008 02:17am

Hi,
I have created an MFC extension DLL, And did the same thing but its giving assertion failure at
m_hInstOld = AfxGetResourceHandle();
Its because of ...
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
{ ASSERT(afxCurrentResourceHandle != NULL);
return afxCurrentResourceHandle; }
I am not able to find out How the afxCurrentResourceHandle is getting NULL.

Alternate Approach

Posted by Atul Arora
on 03/08/2004 12:55am

Hi Andreas,
Good article. I found an alternate approach to do this.
You dont have to make a new class. Instead,
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
in the function
int CDLLDlgDlg::DoModal()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
return CDialog::DoModal();
}
Call this function to set the module state before
initialization and/or to restore the previous module state after cleanup (end of current scope).
By default, MFC uses the resource handle of the main application to load the resource template.
If you have an exported function in a DLL, such as one that launches a dialog box in the DLL,
this template is actually stored in the DLL module.
You need to switch the module state for the correct handle to be used.
You can do this by adding the following code to the beginning of the function:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
So, you dont require a new class to manage this.

Alternate Approach

Posted by Atul Arora
on 03/08/2004 12:52am

Hi Andreas,
Good article. I found an alternate approach to do this.
You dont have to make a new class. Instead,
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
in the function
int CDLLDlgDlg::DoModal()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
return CDialog::DoModal();
}
Call this function to set the module state before
initialization and/or to restore the previous module state after cleanup (end of current scope).
By default, MFC uses the resource handle of the main application to load the resource template. If you have an exported function in a DLL, such as one that launches a dialog box in the DLL, this template is actually stored in the DLL module. You need to switch the module state for the correct handle to be used. You can do this by adding the following code to the beginning of the function:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
So, you dont require a new class to manage this.

Top White Papers and Webcasts

Entire organizations suffer when their networks can't keep up and new opportunities are put on hold. Waiting on service providers isn't good business. In these examples, learn how to simplify network management so that your organization can better manage costs, adapt quickly to business demands, and seize market opportunities when they arise.

Today's enterprise datacenter can be one of the most complex business environments with dozens (for smaller business), hundreds (for larger and midsize business), even thousands (for hyperscale businesses) of servers that must be managed and monitored. At this level, just managing the cords can be challenging — let alone keeping up with the growing need for more agility and scalability within the datacenter. Simply put, companies are aggressively looking for less complexity and more agility from their …