Subject: Re: Building Dlls and exports(gcc & lcc)
From: [email-masked] (Scott Mintz)

24 Apr 1997 09:16:54 -0700
Approved: [email-masked]
Distribution: cygnus
Message-ID: <[email-masked]>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Original-To: [email-masked], Eric Britten <[email-masked]>
Content-Description: cc:Mail note part
Original-Sender: [email-masked]

     You can create an alias for the function name using the .def file.  
     The following text is taken from documentation on LINK32.
     
     Syntax
     EXPORTS definitions
       
     This statement makes one or more definitions available as exports to 
     other programs.
     EXPORTS marks the beginning of a list of export definitions. Each 
     definition must be on a separate line. The EXPORTS keyword can be on 
     the same line as the first definition or on a preceding line. The .DEF 
     file can contain one or more EXPORTS statements.
     
     The syntax for an export definition is:
     entryname[=internalname] [@ordinal[NONAME]] [DATA] [PRIVATE]
       
     The entryname is the name of the function or data item as it is to be 
     used by the calling program. You can optionally specify the 
     internalname as the function known in the defining program; by 
     default, internalname is the same as entryname. The ordinal specifies 
     an index into the exports table in the range 1 through 65,535; if you 
     do not specify ordinal, LINK assigns one. The NONAME keyword exports 
     the function only as an ordinal, without an entryname.
     The DATA keyword specifies that the exported item is a data item. The 
     data item in the client program must be declared using extern 
     __declspec(dllimport).
     
     The optional keyword PRIVATE tells IMPLIB to ignore the definition. 
     PRIVATE prevents entryname from being placed in the import library. 
     The keyword has no effect on LINK.
     There are three methods for exporting a definition, listed in 
     recommended order of use:
      1.     The __declspec(dllexport) keyword in the source code
      2.     An /EXPORT specification in a LINK command
      3.     An EXPORTS statement in a .DEF file
       
     All three methods can be used in the same program. When LINK builds a 
     program that contains exports, it also creates an import library, 
     unless an .EXP file is used in the build.
     
     I hope this helps.
     +------------------------------+------------------------------------+
     | Scott A. Mintz               | voice: (216) 646-4805              |
     | Allen-Bradley Company        | fax:   (216) 646-4961              |
     | 1 Allen-Bradley Drive        | email: [email-masked]   |
     | Mayfield Hts., OH 44124-6118 | CIS:   71461,632                   |
     +------------------------------+------------------------------------+

 

______________________________ Reply Separator _________________________________
Subject: Building Dlls and exports(gcc & lcc)
Author:  Eric Britten <[email-masked]> at Internet
Date:    4/23/97 12:34 PM

Recently I tried to build a very simple Control Panel Applet Dll with both gcc 
and lcc.

For gcc I use dlltool to create an import library simple.a and an export file 
simple.exp

Then when I link using
ld -e _DllEntry@12 -o simple.cpl simple.o simple.exp -subsystem windows -luser32

I get the error:
simple.exp:  fake: can't find CPlApplet

My simple.def file was
EXPORTS
CPlApplet

CPlApplet is defined in simple.c as
LRESULT CALLBACK CPlApplet(HWND, UINT, LPARAM, LPARAM)

CPlApplet is the function Windows that calls to run the applet.  It must be a 
stdcall function.  So in the def file I changed CPlApplet to _CPlApplet, 
_CPlApplet@16 and CPlApplet@16.  CPlApplet@16 worked, there were no link errors,
but now the exported function is CPlApplet@16 instead of CPlApplet so windows 
can't find the right function to call to run the applet.  Although the link 
worked, when I ran the applet using control panel, the applet crashed.  I'm not 
sure why.
     
Can I export a stdcall function without the _ and @n name mangling?

     
I also tried the same thing with lcc. 
lcc -c simple.c
lcclnk -dll -o simple.cpl -subsystem windows simple.def
     
I get the error Can't find starting address.
     
Can anyone help me?
     
-----------------------------------------------
                Eric Britten
              [email-masked]
-----------------------------------------------
     
-
For help on using this list (especially unsubscribing), send a message to 
"[email-masked]" with one line of text: "help".
-
For help on using this list (especially unsubscribing), send a message to
"[email-masked]" with one line of text: "help".