ID Number: Q68081
3.00 3.10
WINDOWS
Summary:
A single import library that contains information about multiple
dynamic-link libraries (DLLs) can sometimes be useful. One example in
the Microsoft Windows graphical environment is LIBW.LIB, which serves
as the single import library through which an application can link to
the Windows system DLLs GDI.DLL, KERNEL.DLL, and USER.DLL.
An import library for many DLLs can be created by supplying multiple
module definition (DEF) files as input parameters to the IMPLIB
utility. However, one must make sure that none of the exported
functions is defined in more than one DEF file. IMPLIB issues an error
message when a function name is defined more than once, which occurs
most often with the Windows exit procedure (WEP) because each DLL must
export its own WEP in its DEF file.
To avoid an IMPLIB error indicating that the WEP routine is defined
many times, create modified DEF files that do not contain EXPORT
statements for the WEP routine and specify these files as input to
IMPLIB.
More Information:
Defining a function in an import library more than once creates an
ambiguity when the loader resolves references to functions exported by
other modules. For example, suppose two DLLs that share a common
import library export an Open function. When an application refers to
a function in a DLL, the loader resolves a reference to the function
(known as a fix-up) to its true address (which is not known until run
time). The DLL containing the function must be loaded to provide a
true address for its functions. However, in this example, this poses a
dilemma: because both DLLs contain an Open function, which one should
be used? Because the application's source code makes no distinction
between the two Open functions, the loader cannot resolve the
reference correctly.
To avoid the potential for ambiguity, IMPLIB issues an error message
for each function that is defined in multiple DEF files and does not
create a combined import library. Two DLLs that share a common
function name cannot share a single import library. The one exception
to this rule is the WEP function, which every DLL must export. Because
an application does not call the WEP, the function need not be listed
in the combined import library.
To create a single import library, MYIMPLIB.LIB, that can be used to
link to the three DLLs (DLL1, DLL2, and DLL3), perform the following
four steps in this order:
1. Compile and link all three DLLs as outlined in Chapter 20 of the
"Microsoft Windows Software Development Kit: Guide to Programming"
for versions 3.0 and 3.1. Use the original DEF file to link each
DLL. Each file must list the WEP in its EXPORTS section with the
RESIDENTNAME qualifier to properly export the WEP function.
2. Copy the module definition files for each DLL (DLL1.DEF, DLL2.DEF,
and DLL3.DEF) into three dummy DEF files (DUMMY1.DEF, DUMMY2.DEF,
and DUMMY3.DEF). These dummy DEF files are used to create the
combined import library as outlined in Step 3 below. Do not link
any DLL using its dummy DEF file.
3. Remove the WEP from the EXPORTS statement of each dummy DEF file.
Only Windows calls the WEP procedure; the application does not.
Therefore, the WEP does not need to be defined in the import
library. Removing the WEP entries prevents an IMPLIB error about
multiple definitions of the WEP routine.
4. Use DUMMY1.DEF, DUMMY2.DEF, and DUMMY3.DEF as input parameters to
the IMPLIB utility, as follows:
IMPLIB MYIMPLIB.LIB DUMMY1.DEF DUMMY2.DEF DUMMY3.DEF
The four steps above build a combined import library that contains the
linkage information required for all of the exported functions in each
of the three DLLs. It does not contain any information about any of
the WEP functions. Because applications do not call the WEP function,
this omission does not cause any linkage problems.
A dummy DEF file must not be used to link a DLL because a dummy DEF
file does not export the WEP function. Every DLL must export a WEP
that Windows can call before removing the DLL from memory.
Additional reference words: 3.00 3.10