Microsoft KB Archive/103244

From BetaArchive Wiki
< Microsoft KB Archive
Revision as of 19:13, 12 August 2020 by X010 (talk | contribs) (X010 moved page Microsoft KB Archive/Q103244 to Microsoft KB Archive/103244 without leaving a redirect: Text replacement - "Microsoft KB Archive/Q" to "Microsoft KB Archive/")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

INF: Example of Importing Functions PSS ID Number: Q103244 Article last modified on 04-23-1994

3.10

WINDOWS NT

The information in this article applies to:
- Microsoft Win32 Software Development Kit (SDK) for Windows NT, version 3.1

SUMMARY

NOTE: This article deals specifically with the Linker shipped with the Win32 SDK, which is the current linker for MIPS and Alpha only.

The linker does not take a .DEF file directly. To use EXPORTS, it is standard to build an export module (.EXP) to link with the dynamic-link library (DLL), and to use an import library (.LIB) to link with any application or DLL that uses this DLL.

There are alternatives to an import library. One alternative is to use LoadLibrary() and GetProcAddress() to call an exported DLL function. Another alternative is to build an import module (.IMP) using the steps described below:

  1. Create the .DEF file. The following is based on the SELECT example. Note that it is necessary to decorate the names and include one dummy export. The __stdcall functions have an appended “@<number>”, where <number> is the number of bytes in the parameter list for the function. The linker automatically handles the underscore, which is prepended to __cdecl and __stdcall function names.

    NAME Demo

    EXPORTS DemoWndProc@12

    IMPORTS select.StartSelection@16 select.UpdateSelection@16 select.EndSelection@8 select.ClearSelection@12

  2. Build the .IMP file:

    $(PROJ).imp: $(PROJ).def <math display="inline">(implib) -machine:</math>(CPU)
    -def:<math display="inline">(PROJ).def \ -out:</math>(PROJ).lib

  3. Link the .IMP file into the application:

    $(PROJ).exe: $(PROJ).obj $(PROJ).rbj $(PROJ).def $(PROJ).imp $(link) $(linkdebug) <math display="inline">(guiflags) \ -out:</math>(PROJ).exe $(PROJ).obj $(PROJ).rbj
    $(PROJ).imp $(guilibsdll)

MORE INFORMATION

If building a DLL, another interesting technique is to use forwarders. For example, the following

LIBRARY test

EXPORTS MyFunc = prvtdll.DllFunc

will expose MyFunc() as an export for TEST.DLL. However, the loader will actually fix up the reference at load time to point to DllFunc in PRVTDLL.DLL. This method involves no additional code.

Another way to provide a forwarder is to write a stub function, which you do export, that forwards the reference for you. On DLL PROCESS_ATTACH, do LoadLibrary(prvtdll), then GetProcAddress() on DllFunc. In your forwarder function, just call through with the arguments passed to you.

Additional reference words: 3.10 KBCategory: Prg KBSubcategory: TlsMisc

=================================================================

Copyright Microsoft Corporation 1994.