What is a DLL? DLL stands for Dynamic Link Library. Using DLL's offers several
advantages as mentioned below:
- Simplify project management. Logical units of work can be split up among different groups during development process to help simplify project management.
- Conserve memory. If two or more applications use the same DLL,
the DLL is loaded into the RAM and this can be shared by all of the
- Extend the features of an application. An application can determine the availability of DLL's dynamically load them & extend/limit the functionality of the application.
- Flexibility of programming languages. You can choose the language best suited for a particular module. Perhaps use Visual Basic for the UI & C++ for the business logic.
Writing the application using a DLL
There are two parts to writing this application.
- Writing the DLL whose functions we are going to call
- Writing a test client for the DLL
Creating the DLL
- Fire up Visual C++ & choose the Project as MFC AppWizard(Dll) and type in Project name as
- Let the default selection for DLL type remain, i.e "Regular DLL using Shared MFC DLL"
- Click Finish and then Ok to get Visual Studio to generate the necessary files.
- Go to the class view, right click on
“MyDll classes” and choose
- Now choose Class type as
"Generic Class" .
- Type in the Class name
CMyClass, the wizard automatically fills in the rest of the names.
- Go to the class view again
- Right click on the
CMyClass and choose
“Add Member Function”
- Type in the name of the function type as
CString and fill in the function declaration as
SayHello (CString strName).
Choose Access type of the function as
public. Note :
CString is a MFC class that makes manipulation of strings very easy.
- Now go to file view and type in the following code into
CMyClass.cpp as shown below in Code Snippet 2
- To be able to call the functions from an external application we have to prefix all function signatures with
__declspec(dllexport) . This change is made in the CMyClass.h file as shown in Code Snippet 1
Compile the application and your DLL is ready
__declspec(dllexport) CString SayHello (CString strName);
__declspec(dllexport) virtual ~CMyClass();
CString CMyClass::SayHello(CString strName)
return "Hello " + strName;
Creating the DLL Client
Now we write a 'Client' to test our DLL
This is a MFC dialog based application with a edit box and two buttons.
New MFC AppWizard(exe) from the project menu and type in the project name
Dialog based application and click Finish
- You would now be looking at the application in the resource view. Add an edit box to the application by selecting the
edit box, next click on the dialog box and drag.
- Also create a
CString (value) variable associated with it, call this variable m_edit i.e Click on the edit box and press CTRL and W to bring up the class wizard. Choose the member variables tab and choose IDC_EDIT1 and click on “Add Variable”, of type "Value" and type
- Now a file called
TestDLLDlg.cpp would have been generated .
- Double click the “Ok” button on the dialog, the wizard pops up a box asking a name for the function, choose the default name “OnOk” to go to the
TestDLLdlg.cpp to look like the Code Snippet 1, the code entered has no effect and the project at this point will not compile.
(Basically we are calling a method of a class object, this object has not been defined as yet.)
- Goto the file
TestDLLDlg.h and include the header file for your class i.e
- In the file
TestDLLDlg.h declare an object of your class
objMyClass present in the DLL
- After steps 8 & 9 the code looks as in Code Snippet 2
- We need to modify the project settings to compile the project, Click on "Project->Settings->Link" and in the "Object/Library Modules" enter the complete or relative path to the DLL's library file.
i.e. A .lib file is generated in the same folder as your DLL, I have entered "..\MyDll\Debug\MyDll.lib" here.
- Compile the application and if it has compiled successfully. Run it.
Hey, Why are we getting this stupid box saying "Unable to located DLL"
Solution: Copy the MyDll.dll to the same folder as the TestDll.exe (See my comment http://www.codeproject.com/Articles/2516/Creating-and-consuming-MFC-DLLs-for-Beginners?msg=228387#xx228387xx)
Run the application, enter a name in the text box and click the okay button, this will show a message box containing the same text prefixed with a hello.
CString strResult = objMyClass.SayHello(m_edit);
class CTestDLLDlg : public CDialog
CTestDLLDlg(CWnd* pParent = NULL); CMyClass objMyClass;
After 10 years (of publishing this article) along came Ed to provide some comments which I feel may be useful - http://www.codeproject.com/Articles/2516/Creating-and-consuming-MFC-DLLs-for-Beginners?msg=4338620#xx4338620xx
He is interested in Hi-Performance code, OO Methodology, OS API's, Optimizing Windows, Tweaking IE.
For the last few years Imran has specialized in developing robust, hi-performance applications & GUI's (Swing) for MNC's.