Creating and consuming MFC DLLs for Beginners






4.44/5 (82 votes)
The objective of this tutorial is to demonstrate in a step by step manner how to build and call methods present in a DLL using Visual C++ 6.0. We are going to develop a DLL that takes in a string as input parameter and returns the string prefixed with a "Hello".
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 asSayHello (CString strName)
. Choose Access type of the function aspublic
. 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
// CMyClass.h //{----------- Code Snippet 1 -------------------------- class CMyClass { public: __declspec(dllexport) CString SayHello (CString strName); __declspec(dllexport) CMyClass(); __declspec(dllexport) virtual ~CMyClass(); }; //{----------- Code Snippet 1 --------------------------
// CMyClass.cpp //{----------- Code Snippet 2 -------------------------- CString CMyClass::SayHello(CString strName) { //Return the input string with a Hello prefixed return "Hello " + strName; } //{----------- Code Snippet 2 --------------------------
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 nameTestDLL
- 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 typem_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.eMyClass.h
. - In the file
TestDLLDlg.h
declare an object of your classobjMyClass
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.
//TestDLLdlg.cpp // ----------------- Code Snippet 1 ---------------------------- void CTestDLLDlg::OnOK() { UpdateData(true); CString strResult = objMyClass.SayHello(m_edit); AfxMessageBox (strResult); //CDialog::OnOK(); } // ----------------- Code Snippet 1 ----------------------------
// ----------------- Code Snippet 2 ---------------------------- //TestDLLDlg.h ///////////////////////////////////////////////////////////////////////////// // CTestDLLDlg dialog #include "..\MyDll\MyClass.h" class CTestDLLDlg : public CDialog { // Construction public: CTestDLLDlg(CWnd* pParent = NULL); // standard constructor CMyClass objMyClass; // Dialog Data // ----------------- Code Snippet 2 ----------------------------
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