Click here to Skip to main content
15,890,557 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

 
GeneralRe: unsigned int* return value of dll function Pin
Neil Yao25-Aug-02 21:50
Neil Yao25-Aug-02 21:50 
QuestionHow to dynamically load a MFC dll ? Pin
WilliamXu5188-Jul-02 4:56
WilliamXu5188-Jul-02 4:56 
GeneralThere is one more approach -- DELAYLOAD Pin
26-Jun-02 17:39
suss26-Jun-02 17:39 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Arbesto Pelta27-Jun-02 3:24
Arbesto Pelta27-Jun-02 3:24 
GeneralRe: There is one more approach -- DELAYLOAD Pin
27-Jun-02 17:57
suss27-Jun-02 17:57 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Anonymous5-Nov-02 10:26
Anonymous5-Nov-02 10:26 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Philippe Lhoste1-Jul-02 2:56
Philippe Lhoste1-Jul-02 2:56 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Arbesto Pelta1-Jul-02 8:04
Arbesto Pelta1-Jul-02 8:04 
Yes Philippe, you are right: IMHO the solution offered in the article is not outdated, it is a good solution, a linker independent solution and a more controlled solution than the linker v6.0 offered. Personally I like the solution and I am going to use it.

But I think that the article is outdated because actually the linker offer a direct solution that I suspect the author didnt know when he wrote it (I dont knew the linker solution not even the author solution before read them). It is an easy solution that would be remarked. The linker solution was pointed in a thread response, ok, but I think this solution deserve to appear in a more remarked position.

I think that maybe the author must to have the righ to modify his article introduction, that's all.

And again you are right, the author solution is very useful when you need to use a dll whose name isn't even knwon at compile time. However (I am not sure but...) the /DELAYLOAD solution seem to solve this situation too, developing your own helper function.

I think that the author solution has another notable virtue: it is a solution with a very low overhead, there is not hidden hooks or callbacks, only a function pointer, thats all. The programmer can add his own call controls when he need. For example, if you need to call a dll function repeatedly in a exhaustive for loop then maybe you prefer to check (one time) that the dll and function pointer are ok before going to do the for loop instead of check it before every time you want to call it.

Thanks a lot

Arbesto
GeneralRe: There is one more approach -- DELAYLOAD Pin
1-Jul-02 21:15
suss1-Jul-02 21:15 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Philippe Lhoste1-Jul-02 21:47
Philippe Lhoste1-Jul-02 21:47 
GeneralRe: There is one more approach -- DELAYLOAD Pin
2-Jul-02 19:27
suss2-Jul-02 19:27 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Philippe Lhoste2-Jul-02 22:04
Philippe Lhoste2-Jul-02 22:04 
GeneralRe: There is one more approach -- DELAYLOAD Pin
5-Jul-02 21:13
suss5-Jul-02 21:13 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Philippe Lhoste7-Jul-02 21:54
Philippe Lhoste7-Jul-02 21:54 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Arbesto Pelta10-Jul-02 10:20
Arbesto Pelta10-Jul-02 10:20 
GeneralRe: There is one more approach -- DELAYLOAD Pin
Philippe Lhoste10-Jul-02 21:53
Philippe Lhoste10-Jul-02 21:53 
GeneralAnybody know how to modify the article after being removed from the unedited section Pin
Neil Yao26-Jun-02 15:42
Neil Yao26-Jun-02 15:42 
GeneralRe: Anybody know how to modify the article after being removed from the unedited section Pin
KarstenK20-Feb-03 23:09
mveKarstenK20-Feb-03 23:09 
GeneralAnalogy with HTTP homemade APIs vs. SOAP Pin
Joaquín M López Muñoz26-Jun-02 13:47
Joaquín M López Muñoz26-Jun-02 13:47 
GeneralRe: Analogy with HTTP homemade APIs vs. SOAP Pin
Neil Yao26-Jun-02 15:12
Neil Yao26-Jun-02 15:12 
GeneralJust an additional macro and idea... and question Pin
Arbesto Pelta26-Jun-02 9:03
Arbesto Pelta26-Jun-02 9:03 
GeneralRe: Just an additional macro and idea... and question Pin
Neil Yao26-Jun-02 15:53
Neil Yao26-Jun-02 15:53 
GeneralSimple solution for simple needs Pin
.WTL26-Jun-02 6:26
.WTL26-Jun-02 6:26 
GeneralYou want interfaces: Just use real Interfaces! Pin
Ingo Kellpinski25-Jun-02 23:20
Ingo Kellpinski25-Jun-02 23:20 
GeneralRe: You want interfaces: Just use real Interfaces! Pin
Neil Yao25-Jun-02 23:28
Neil Yao25-Jun-02 23:28 

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.