Jump to content

Creating C++ DLL

From EDM2
Revision as of 05:40, 31 March 2019 by Martini (talk | contribs) (Created page with "; TN1001 This example creates a class called base in testdll.cpp which is placed into a DLL. Main in sample.c instantiates class base and calls a function in base to print o...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
TN1001

This example creates a class called base in testdll.cpp which is placed into a DLL.

Main in sample.c instantiates class base and calls a function in base to print out a message. C++ exception handling from a DLL is demonstrated by having the function do a throw which is caught in a catch block in main.

Mangled names apprear in the IMPORT section of sample.def below. 1) use "cppfilt /B /P sample.obj" to dump mangled names 2) build a library using sample.obj and get a listing using lib.exe 3) there are some utilities programs available that can dump obj names

SOURCE

dlltest.hpp
             class base {
               public:
                 void func(void);
                 ~base(void);
                 class bomb{
                   public:
                     bomb(int i) { }
                 };
             };
dlltest.cpp
             #include  <stdio.h>
             #include  "dlltest.hpp"
             #pragma export(base::func(void))
             #pragma export(base::~base(void))
             base::~base(void) {
                printf("in base destructor\n");
             }
             void base::func(void) {
                printf("in base func\n");
                throw bomb(1);
             }
dlltest.def
             LIBRARY DLLTEST INITINSTANCE
             DESCRIPTION 'Classes Dynamic Linking library'
             PROTMODE
             DATA        MULTIPLE READWRITE LOADONCALL
             CODE        LOADONCALL


sample.cpp
             #include <stdio.h>
             #include  "dlltest.hpp"
             void main()
             {
               base *b = new base();
               printf("after new\n");
               try {
                 b->func();
               }
               catch (base::bomb x) {
                 printf("caught\n");
               }
               printf("after d->func()\n");
               delete b;
               printf("after delete b\n");
             }
sample.def
             NAME SAMPLE WINDOWCOMPAT
             IMPORTS
               dlltest.__dt__4baseFv
               dlltest.func__4baseFv

COMPILE OPTIONS

icc -Gm+ -Fd -Ge-  dlltest.cpp dlltest.def
icc -Gm+ -Fd       sample.cpp sample.def

various combinations of -Gd+ -Gm are possible depending on the desired configuration.

OUTPUT

  after new
  in base func
  caught
  after d->func()
  in base destructor
  after delete b