Introduction
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
applications.
- 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
MyDll
- 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 “New Class”.
- 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
class CMyClass
{
public:
__declspec(dllexport) CString SayHello (CString strName);
__declspec(dllexport) CMyClass();
__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.
- Select
New MFC AppWizard(exe)
from the project menu and type in the project name TestDLL
- Choose
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 m_edit
- 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
file
- Modify
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 MyClass.h
.
- 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.
void CTestDLLDlg::OnOK()
{
UpdateData(true);
CString strResult = objMyClass.SayHello(m_edit);
AfxMessageBox (strResult);
}
#include "..\MyDll\MyClass.h"
class CTestDLLDlg : public CDialog
{
public:
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