Click here to Skip to main content
15,890,043 members
Articles / Programming Languages / C++
Article

A class to wrap DLL functions

Rate me:
Please Sign up or sign in to vote.
4.76/5 (36 votes)
25 Jun 20021 min read 312K   2.5K   81   79
Make using of dll functions much easy

Introduction

My project needs to manage a large set of DLLs. All of them export a same set of functions. None of them link with the main project at compile time. We call them PlugIns. These plugins are used to extend the ability of the main program. Once they are copied into the program directory, the program can use them, and if they are removed from the directory, the main program works just fine, except that some functions cannot be used.

Since these DLLs are not available at the time that the main program is compiled, we have to use LoadLibrary, GetProcAddress and FreeLibrary to use these DLLs. It's really boring! I needed a class to ease this job. In fact, these DLLs looks just like classes (they all have the same interface: a set of functions). Using a class to wrap these DLLs is just reasonable.

Here comes the class CDLLModule. This class is only for deriving. Let's see how to use it first. Suppose you have a DLL which export two functions like this:

int WINAPI GetEngine(char *szEngineType, char *szEngineVersion);
int WINAPI StartEngine(HWND hWnd);

The wrapper class would like this:

class CMyClass : public CDLLModule
{
    DECLARE_DLL_FUNCTION(int, WINAPI,
                          GetEngine, (char *, char *))
    DECLARE_DLL_FUNCTION(int, WINAPI,
                                  StartEngine, (HWND))

    BEGIN_DLL_INIT()
        INIT_DLL_FUNCTION(int, WINAPI,
             GetEngine, (char *, char *), "GetEngine")
        INIT_DLL_FUNCTION(int, WINAPI,
                   StartEngine, (HWND), "StartEngine")
    END_DLL_INIT()
};

Then we can use it like this:

CMyClass    module;
module.Init("MyDLL.dll");
module.GetEngine(m_str1, m_str2);
module.StartEngine(m_hWnd);

I should explain it in more detail, but I am really not good at English. Anyway, the code is very simple, only 64 lines including comments. I think it's very useful, and I hope you think so too.

One last thing. It's a good idea to check the validation of the function before calling. In another word, if you are not sure that all functions are exported well from the DLL, Call it like this:

if (module.GetEngine)
    module.GetEngine(m_str1, m_str2);

Enjoy :)

Revision History

26 Jun 2002 - Initial Revision

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
China China
I'm a chinese programer living in Shanghai, currently working for a software company whose main business is to deliver computer based testing. Software simulation for computer based testing and certifications is my main responsibility in this company. Execpt for software development, I like out-door activities and photography. I am willing to make friends in China and all over the world, so contact me if you have anything in common with meSmile | :)

Comments and Discussions

 
QuestionLicense Pin
nikusoft10-Jun-15 21:38
nikusoft10-Jun-15 21:38 
QuestionFreeLibrary function VS 2005 - WXP Pin
nemarc24-Apr-10 1:30
professionalnemarc24-Apr-10 1:30 
GeneralHummmmmm Pin
Kelly Cristina Mara2-Mar-08 12:10
Kelly Cristina Mara2-Mar-08 12:10 
GeneralMeaning of the second parametr DECLARE_DLL_FUNCTION Pin
badzio23-Feb-07 2:40
badzio23-Feb-07 2:40 
GeneralRe: Meaning of the second parametr DECLARE_DLL_FUNCTION Pin
badzio23-Feb-07 2:57
badzio23-Feb-07 2:57 
GeneralDLL code Pocket PC Pin
Ziggy2k27-Sep-05 6:26
Ziggy2k27-Sep-05 6:26 
GeneralRe: DLL code Pocket PC Pin
Neil Yao27-Sep-05 18:56
Neil Yao27-Sep-05 18:56 
GeneralOPSEC SDK Pin
Anonymous24-May-05 5:34
Anonymous24-May-05 5:34 
QuestionWhat abt Consructor and others?? Pin
4-Mar-05 19:42
suss4-Mar-05 19:42 
QuestionHow to calling this DLL into VB6 Pin
alejorb7-Aug-04 6:48
alejorb7-Aug-04 6:48 
AnswerRe: How to calling this DLL into VB6 Pin
Neil Yao8-Aug-04 15:45
Neil Yao8-Aug-04 15:45 
Generaltanx Pin
asd175325-Nov-03 10:41
asd175325-Nov-03 10:41 
GeneralRe: tanx Pin
Ralph Wetzel9-Apr-04 2:29
Ralph Wetzel9-Apr-04 2:29 
Generalcannot access private member declared in class 'CDLLClass' Pin
posbis9-Sep-03 10:43
posbis9-Sep-03 10:43 
Hello all

I tried to wrap some DLL functions of a DLL of mine with DLLModule.h It looked simple and efficient to me but I can't get it working. My VC++ 6 always bails out with the following error message during compile.

error C2248: 'Init' : cannot access private member declared in class 'CDLLClass'
i:\advancedpipeserver\aps\aps.h(149) : see declaration of 'Init'

The definition of my class looks as follows:

class CDLLClass : public CDLLModule
{
DECLARE_DLL_FUNCTION(long, WINAPI, KillProcessByName , (char *) )
DECLARE_DLL_FUNCTION(long, WINAPI, ExistProcessByName, (char *) )

BEGIN_DLL_INIT()
INIT_DLL_FUNCTION(long, WINAPI, KillProcessByName , (char *), "fnKillProcessByName")
INIT_DLL_FUNCTION(long, WINAPI, ExistProcessByName, (char *), "fnExistProcessByName")
END_DLL_INIT()
};


The initialisation of the class is done like this:

CDLLClass *aps_module;

aps_module = new CDLLClass;
aps_module->Init("apsdll.dll");

If I comment the "Init" function I can compile and can see the functions wrapped inside the class.

-aps_module 0x008249f0
-CDLLModule {...}
-__vfptr 0x00429184 const CDLLClass::`vftable'
[0] 0x004011a4 CDLLClass::`vector deleting destructor'(unsigned int)
[1] 0x00401023 CDLLClass::Init(char const *)
-m_hDLL 0x00000000
unused CXX0030: Error: expression cannot be evaluated
KillProcessByName 0xcdcdcdcd
ExistProcessByName 0xcdcdcdcd


So I can see my functions declared but what looks strange to me is that the function "IsLoaded()" is missing. "Init" and "Destructor" are defined in the "virtual function pointer table" of the class. But to my knowledge, this is only the virtual Init-function from the base class CDLLModule. So far so good but why do I see this strange error message as soon as I uncomment my
"aps_module->Init...." line ? It doesn't see or should I say accept the Init-Function produced from the MACROS.


Any idea ?

Regards
Oliver
GeneralRe: cannot access private member declared in class 'CDLLClass' Pin
posbis9-Sep-03 10:58
posbis9-Sep-03 10:58 
GeneralRe: cannot access private member declared in class 'CDLLClass' Pin
Neil Yao9-Sep-03 14:59
Neil Yao9-Sep-03 14:59 
Questionhow to use it with no arguements Pin
nikhilpp8-Aug-03 7:43
nikhilpp8-Aug-03 7:43 
AnswerRe: how to use it with no arguements Pin
Neil Yao11-Aug-03 15:05
Neil Yao11-Aug-03 15:05 
GeneralSuggestion to use typedef in the macros Pin
Andrew Schetinin5-Jul-03 22:45
Andrew Schetinin5-Jul-03 22:45 
GeneralI forgot about UNICODE too Pin
Andrew Schetinin5-Jul-03 22:51
Andrew Schetinin5-Jul-03 22:51 
Generalcreating a Game engine DLL Pin
sriniatig10-Apr-03 22:57
sriniatig10-Apr-03 22:57 
GeneralRe: creating a Game engine DLL Pin
Neil Yao13-Apr-03 15:38
Neil Yao13-Apr-03 15:38 
GeneralRe: creating a Game engine DLL Pin
Andrew Schetinin3-Jul-03 3:36
Andrew Schetinin3-Jul-03 3:36 
GeneralHeader From lib Pin
Fad B2-Mar-03 14:15
Fad B2-Mar-03 14:15 
GeneralDebug Error! Pin
www.codeproject.com14-Feb-03 22:19
www.codeproject.com14-Feb-03 22:19 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.