Creating C++ DLL: Difference between revisions
Appearance
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..." |
mNo edit summary |
||
Line 9: | Line 9: | ||
Mangled names apprear in the IMPORT section of sample.def below. | Mangled names apprear in the IMPORT section of sample.def below. | ||
# use "cppfilt /B /P sample.obj" to dump mangled names | |||
# build a library using sample.obj and get a listing using lib.exe | |||
# there are some utilities programs available that can dump obj names | |||
==SOURCE== | ==SOURCE== | ||
; dlltest.hpp | ; dlltest.hpp | ||
class base { | |||
public: | |||
void func(void); | |||
~base(void); | |||
class bomb{ | |||
public: | |||
bomb(int i) { } | |||
}; | |||
}; | |||
; dlltest.cpp | ; 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 | ; dlltest.def | ||
LIBRARY DLLTEST INITINSTANCE | |||
DESCRIPTION 'Classes Dynamic Linking library' | |||
PROTMODE | |||
DATA MULTIPLE READWRITE LOADONCALL | |||
CODE LOADONCALL | |||
; sample.cpp | ; 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 | ; sample.def | ||
NAME SAMPLE WINDOWCOMPAT | |||
IMPORTS | |||
dlltest.__dt__4baseFv | |||
dlltest.func__4baseFv | |||
==COMPILE OPTIONS== | ==COMPILE OPTIONS== | ||
icc -Gm+ -Fd -Ge- dlltest.cpp dlltest.def | icc -Gm+ -Fd -Ge- dlltest.cpp dlltest.def |
Revision as of 01:32, 1 April 2019
- 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.
- use "cppfilt /B /P sample.obj" to dump mangled names
- build a library using sample.obj and get a listing using lib.exe
- 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