[Back to UNITINFO SWAG index]  [Back to Main SWAG index]  [Original]

> I'm having some problems with putting DLL'd routines into my program.

{---HELLO.PAS---}  { a sample DLL }

Library Hello;

Function HelloWorld : PChar; export;
  HelloWorld := 'Hello, world! Greetings from HELLO.DLL!'
End; { HelloWorld }

  HelloWorld index 1;



{---DLLDEMO.PAS---} { a sample program that uses routine from HELLO.DLL }

Program DLLDemo;

uses WinCrt;

  DLLName = 'HELLO';

Function HelloWorld : PChar; far; external DLLName;


And RTM:

In the Windows and protected mode environments, dynamic-link libraries
(DLLs) permit several applications to share code and resources.

A DLL is an executable module (extension .DLL) that contains code or
resources that are used by other DLLs or applications.

DLLs provide the ability for multiple programs ("clients") to share a single
copy of a routine they have in common. The .DLL file must be present when
the client program runs.

The Borland Pascal concept most comparable to a DLL is a unit. However,
routines in units are linked into your executable at link time ("statically
linked"), whereas DLL routines reside in a seperate file and are made
available at run time ("dynamically linked").

When the program is loaded into memory, the Windows or DOS protected mode
program loader dynamically links the procedure and function calls in the
program to their entry points in the DLLs used by the program.

A Borland Pascal application can use DLLs that were not written in Borland
Pascal. Also, programs written in other languages can use DLLs written in
Borland Pascal.

DLLs that are compiled for Windows can also be used in DOS protected mode if
the DLLs use only the Windows functions defined in WinAPI.unit. This subset
of the Windows API is emulated by the DOS protected mode Run-Time Manager,
allowing one DLL file to run in Windows or in DOS without recompiling.

 Using DLLs
There are two ways to access and call a DLL function:

  1. Using an external declaration in your program.
  2. Using GetProcAddress to initialize procedure pointers in your program.

In order for a module to use a procedure or function that is in a DLL, it
imports the procedure or function using an external declaration.

In imported procedures and functions, the external directive takes the place
of the declaration and statement parts that would otherwise be present.

Imported procedures and functions behave just like normal ones, except they
must use the far call model (use a far procedure directive or a
{$F+} compiler directive.)

Borland Pascal provides three ways to import procedures and functions:

  - by name
  - by new name
  - by ordinal

Although a DLL can have variables, it is not possible to import them in to
other modules. Any access to a DLL's variables must take place through a
procedural interface.

This external declaration imports the function GlobalAlloc from the DLL
called KERNEL (the Windows kernel):

   function GlobalAlloc(Flags: Word; Bytes: Longint): THandle; far; external
    'KERNEL' index 15;

Note: The DLL name specified after the external keyword and the new name
specified in a name clause do not have to be string literals. Any constant
string expression is allowed.

Likewise, the ordinal number specified in an index clause can be any
constant-integer expression. For example:

     TestLib = 'TESTLIB';
     Ordinal = 5;

   procedure ImportByName;    external TestLib;
   procedure ImportByNewName; external TestLib name 'REALNAME';
   procedure ImportByOrdinal; external TestLib index Ordinal;

 Writing DLLs
The structure of a Borland Pascal DLL is identical to that of a program,
except that a DLL starts with a library header instead of a program header.

The library header tells Borland Pascal to produce an executable file with
the extension .DLL instead of .EXE. It also ensures that the executable file
is marked as being a DLL.

If procedures and functions are to be exported by a DLL, they must be
compiled with the export procedure directive.

This implements a very simple DLL with two exported functions:
   library MinMax;

   {The export procedure directive prepares Min and Max for exporting}

   function Min(X, Y: Integer): Integer; export;
     if X < Y then Min := X else Min := Y;

   function Max(X, Y: Integer): Integer; export;
     if X > Y then Max := X else Max := Y;

   {The exports clause actually exports the two routines, supplying an
    optional ordinal number for each of them}

     Min index 1,
     Max index 2;

Libraries often consist of several units. In such cases, the library source
file itself is frequently reduced to a uses clause, an exports clause, and
the library's initialization code.

For example:
   library Editors;

   uses EdInit, EdInOut, EdFormat, EdPrint;

     InitEditors index 1,
     DoneEditors index 2,
     InsertText index 3,
     DeleteSelection index 4,
     FormatSelection index 5,
     PrintSelection index 6,
     SetErrorHandler index 53;


Sooo, i hope that i helped u a little byte. BTW, the information above was
taken from Borland Pascal help file.

[Back to UNITINFO SWAG index]  [Back to Main SWAG index]  [Original]