DLL Tutorial PDF
DLL Tutorial PDF
DLL Tutorial PDF
Audience
This tutorial will be useful for software programmers interested in learning the
concepts of Windows DLL and how to use them in practice.
Prerequisites
You must have a good understanding of Windows concepts and you should be
familiar with either VC++ or C/C++.
All the content and graphics published in this e-book are the property of
Tutorials Point (I) Pvt. Ltd. The user of this e-book is prohibited to reuse, retain,
copy, distribute or republish any contents or a part of contents of this e-book in
any manner without written consent of the publisher.
We strive to update the contents of our website and tutorials as timely and as
precisely as possible, however, the contents may contain inaccuracies or errors.
Tutorials Point (I) Pvt. Ltd. provides no guarantee regarding the accuracy,
timeliness or completeness of our website or its contents including this tutorial.
If you discover any errors on our website or in this tutorial, please notify us at
contact@tutorialspoint.com
i
Table of Contents
About the Tutorial ..................................................................................................................................... i
Audience .................................................................................................................................................... i
Prerequisites .............................................................................................................................................. i
1. INTRODUCTION..................................................................................................................... 1
3. REGISTERING ........................................................................................................................ 9
4. TOOLS ................................................................................................................................. 10
5. TIPS ..................................................................................................................................... 11
6. EXAMPLES ........................................................................................................................... 13
ii
DLL
1. INTRODUCTION
Many times, DLLs are placed in files with different extensions such as .EXE, .DRV
or .DLL.
Advantages of DLL
Given below are a few advantages of having DLL files.
Applications and DLLs can link to other DLLs automatically, if the DLL linkage is
specified in the IMPORTS section of the module definition file as a part of the
compile. Else, you can explicitly load them using the Windows LoadLibrary
function.
1
DLL
2
DLL
First, we will discuss the issues and the requirements that you should consider
while developing your own DLLs.
Types of DLLs
When you load a DLL in an application, two methods of linking let you call the
exported DLL functions. The two methods of linking are:
The following list describes the application criteria for choosing between load-
time dynamic linking and runtime dynamic linking:
Startup performance
If the initial startup performance of the application is important, you
should use runtime dynamic linking.
Ease of use
In load-time dynamic linking, the exported DLL functions are like local
functions. It helps you call these functions easily.
3
DLL
Application logic
In runtime dynamic linking, an application can branch to load different
modules as required. This is important when you develop multiple-
language versions.
Additionally, if the application is multithreaded, you can use thread local storage
(TLS) to allocate memory that is private to each thread in the entry point
function. The following code is an example of the DLL entry point function.
4
DLL
When the entry point function returns a FALSE value, the application will not
start if you are using load-time dynamic linking. If you are using runtime
dynamic linking, only the individual DLL will not load.
The entry point function should only perform simple initialization tasks and
should not call any other DLL loading or termination functions. For example, in
the entry point function, you should not directly or indirectly call the
LoadLibrary function or the LoadLibraryEx function. Additionally, you should
not call the FreeLibrary function when the process is terminating.
To use a function keyword, you must declare each function that you want to
export with the following keyword:
__declspec(dllexport)
To use exported DLL functions in the application, you must declare each function
that you want to import with the following keyword:
__declspec(dllimport)
Typically, you would use one header file having a define statement and an ifdef
statement to separate the export statement and the import statement.
You can also use a module definition file to declare exported DLL functions.
When you use a module definition file, you do not have to add the function
keyword to the exported DLL functions. In the module definition file, you declare
the LIBRARY statement and the EXPORTS statement for the DLL. The following
code is an example of a definition file.
// SampleDLL.def
//
LIBRARY "sampleDLL"
EXPORTS
HelloWorld
5
DLL
The following code is an example of a DLL that was created in Visual C++ by
using the Win32 Dynamic-Link Library project type.
// SampleDLL.cpp
#include "stdafx.h"
#define EXPORTING_DLL
#include "sampleDLL.h"
void HelloWorld()
{
MessageBox( NULL, TEXT("Hello World"),
TEXT("In a DLL"), MB_OK);
}
// File: SampleDLL.h
//
#ifndef INDLL_H
#define INDLL_H
#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld() ;
#else
6
DLL
#endif
// SampleApp.cpp
#include "stdafx.h"
#include "sampleDLL.h"
NOTE: In load-time dynamic linking, you must link the SampleDLL.lib import
library that is created when you build the SampleDLL project.
In runtime dynamic linking, you use code that is similar to the following code to
call the SampleDLL.dll exported DLL function.
...
typedef VOID (*DLLPROC) (LPTSTR);
...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
7
DLL
BOOL fFreeDLL;
hinstDLL = LoadLibrary("sampleDLL.dll");
if (hinstDLL != NULL)
{
HelloWorld = (DLLPROC) GetProcAddress(hinstDLL,"HelloWorld");
if (HelloWorld != NULL)
(HelloWorld);
fFreeDLL = FreeLibrary(hinstDLL);
}
...
When you compile and link the SampleDLL application, the Windows operating
system searches for the SampleDLL DLL in the following locations in this order:
8
DLL
3. REGISTERING
regsvr32 somefile.dll
regsvr32 /u somefile.dll
9
DLL
4. TOOLS
Several tools are available to help you troubleshoot DLL problems. Some of
them are discussed below.
Dependency Walker
The Dependency Walker tool (depends.exe) can recursively scan for all the
dependent DLLs that are used by a program. When you open a program in
Dependency Walker, the Dependency Walker performs the following checks:
Checks for modules that are not valid because the modules are for a
different operating system.
By using Dependency Walker, you can document all the DLLs that a program
uses. It may help prevent and correct DLL problems that may occur in the
future. Dependency Walker is located in the following directory when you install
Microsoft Visual Studio 6.0:
Dlister.exe - This utility enumerates all the DLLs on the computer and
logs the information to a text file or to a database file.
Dcomp.exe - This utility compares the DLLs that are listed in two text
files and produces a third text file that contains the differences.
Dtxt2DB.exe - This utility loads the text files that are created by using
the Dlister.exe utility and the Dcomp.exe utility into the dllHell database.
10
DLL
5. TIPS
C strings are NULL terminated. If your DLL function returns numeric data
in a binary string format (for example, via GPIB or the serial port), it may
return NULL values as a part of the data string. In such cases, passing
arrays of short (8-bit) integers is most reliable.
If you are working with arrays or strings of data, ALWAYS pass a buffer or
array that is large enough to hold any results placed in the buffer by the
function unless you are passing them as LabVIEW handles, in which case
you can resize them using CIN functions under Visual C++ or Symantec
compiler.
List DLL functions in the EXPORTS section of the module definition file if
you are using _stdcall.
List DLL functions that other applications call in the module definition file
EXPORTS section or to include the _declspec (dllexport) keyword in the
function declaration.
If you use a C++ compiler, export functions with the extern .C.{}
statement in your header file in order to prevent name mangling.
If you are writing your own DLL, you should not recompile a DLL while the
DLL is loaded into the memory by another application. Before recompiling
a DLL, ensure that all applications using that particular DLL are unloaded
from the memory. It ensures that the DLL itself is not loaded into the
memory. You may fail to rebuild correctly if you forget this and your
compiler does not warn you.
11
DLL
Test your DLLs with another program to ensure that the function (and the
DLL) behave correctly. Testing it with the debugger of your compiler or a
simple C program in which you can call a function in a DLL will help you
identify whether possible difficulties are inherent to the DLL or LabVIEW
related.
12
DLL
6. EXAMPLES
We have seen how to write a DLL and how to create a "Hello World" program.
That example must have given you an idea about the basic concept of creating a
DLL.
Here, we will give a description of creating DLLs using Delphi, Borland C++, and
again VC++.
Start a new DLL project in Delphi (Click File -> New, select DLL).
uses
SysUtils,
Classes;
begin
end.
(If you are a command line kind of guy, then you can just execute "dcc32
delhpdll.dpr" from the command line ... that will give you the same DLL
but without the IDE stuff ...).
14
DLL
Fill in the source code for interfacing the DLL as given below.
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
15
DLL
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
16
DLL
Label1.Caption := inttostr(Max(i,j));
// Easy, eh?
end;
// If succesful ...
if Handle <> 0 then
17
DLL
begin
// Unload library
FreeLibrary(Handle);
end;
end;
end.
Save the project as "DLLproj"; save the source file as "MyMax". Then build the
project, e.g. using CTRL-F9. You can't run the project because there is no main,
so pressing F9 will result in an error.
18
DLL
Now we need a main project to call the DLL. Start a new Console application
(File -> New, choose Console Wizard). No need to include support for VCL or
multithreading. Then enter the source:
#include <iostream.h>
cout << '-' << a << " er " << b << " ! \n";
}
Next, include the DLL in the project (Project -> Add to Project). It is the .lib file
(DLLproj.lib) that you need to include. Save the project. Then build the project.
(To see the results, you may probably need to run it from a DOS prompt).
Save this to file myfun.cpp and compile it from the DOS prompt with:
cl -LD myfun.cpp
The -LD switch says to generate a DLL. Next we make an executable, which calls
the DLL. Here's the source:
#include iostream.h
19
DLL
void main(void)
{
int a = 6;
int b = a;
myfun(&b);
cout << '-' << a << " is " << b << "! \n";
}
Save this to the file main.cpp. Then compile and link from the command prompt
with:
The following code is an example of a DLL that was created in Visual C++ by
using the Win32 Dynamic-Link Library project type.
// SampleDLL.cpp
//
#include "stdafx.h"
#define EXPORTING_DLL
#include "sampleDLL.h"
20
DLL
void HelloWorld()
{
MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);
}
// File: SampleDLL.h
//
#ifndef INDLL_H
#define INDLL_H
#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld() ;
#else
extern __declspec(dllimport) void HelloWorld() ;
#endif
#endif
21