Jump to content

Creating C++ DLL: Difference between revisions

From EDM2
No edit summary
Ak120 (talk | contribs)
mNo edit summary
 
Line 3: Line 3:
This example creates a class called base in testdll.cpp which is placed into a DLL.
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
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.
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.
Mangled names apprear in the IMPORT section of sample.def below.
Line 75: Line 72:


==COMPILE OPTIONS==
==COMPILE OPTIONS==
  icc -Gm+ -Fd -Ge-  dlltest.cpp dlltest.def
  icc -Gm+ -Fd -Ge-  dlltest.cpp dlltest.def
  icc -Gm+ -Fd      sample.cpp sample.def
  icc -Gm+ -Fd      sample.cpp sample.def
various combinations of -Gd+ -Gm are possible depending on the desired configuration.
various combinations of -Gd+ -Gm are possible depending on the desired configuration.


==OUTPUT==
==OUTPUT==
   after new
   after new
   in base func
   in base func
Line 90: Line 84:
   after delete b
   after delete b


 
[[Category:C++ Articles]]
 
[[Category:Languages Articles]]

Latest revision as of 06:53, 27 December 2022

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