Question

HowTo: LoadLibrary and GetProcAddress?

Asked by: newton-allan

I'm trying to use up to 3 dll's in an vc6 application. On the end-user's system, not all the dll's will necessarily be installed. I'm using LoadLibrary so the program can proceed as long as at least one .dll is loaded.

My problem is that the project(s) seems setup such that I get a runtime error message if all three .dll's aren't available. Also, the _ASSERTE statement below for GetProcAddress is failing.

Here is a "stub" of the vc6 main.cpp

#include "FirstDll.h"
#include "SecondDll.h"
#include "ThirdDll.h"

void main(void)
{
   const char* pBuf;
   HINSTANCE hLibrary = ::LoadLibrary("FirstDll.dll");
   if (hLibrary == NULL) {
      printf("Unable to load FirstDll\n");
   }
   else {
      pBuf = FirstGetBuf(1);
      printf([%s]\n", pBuf);
      ::FreeLibrary(hLibrary);
   }
   hLibrary = ::LoadLibrary("SecondDll.dll");
   if (hLibrary == NULL) {
      printf("Unable to load SecondDll\n");
   }
   else {
      pBuf = SecondGetBuf(1);
      printf([%s]\n", pBuf);
      ::FreeLibrary(hLibrary);
   }
   hLibrary = ::LoadLibrary("ThirdDll.dll");
   if (hLibrary == NULL) {
      printf("Unable to load ThirdDll\n");
   }
   else {
      pBuf = ThirdGetBuf(1);
      printf([%s]\n", pBuf);
      ::FreeLibrary(hLibrary);
   }
/*
   typedef const char* const (CALLBACK* GET_PROC)(USHORT);
   GET_PROC pGetBuf;
   pGetBuf  = (GET_PROC)GetProcAddress(hLibrary, "ThirdGetBuf");
   _ASSERTE(pGetBuf != NULL);
   pBuf = pGetBuf((USHORT)1);
*/  
}

Note that the commented out statements don't work ... the _ASSERTE is raised because GetProcAddress isn't resolving the function FirstGetBuf.

Here is a stub of FirstDll.h as generated by the Vc6 wizard for Win32 Dynamic Link Library:
#ifdef FIRSTINDLL_EXPORTS
#define FIRSTINDLL_API __declspec(dllexport)
#else
#define FIRSTINDLL_API __declspec(dllimport)
#endif

// Exported function.
FIRSTINDLL_API const char* const FirstGetBuf(USHORT Num);

If SecondDll.dll isn't installed at run-time, I get the message:

"This application has failed to start because SecondDll.dll was not found. Re-installing the application may fix this problem."

What am I doing wrong? Do I have the main.dsp project and/or *Dll.dsp projects incorrectly setup to insist that the *Dll.dll files exists? Do I need to have .def files? Does having the statement:
  pBuf = FirstGetBuf(1);
cause the linker to insist on having FirstDll.dll be present? How to I get the GetProcAddress call to work?

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2006-05-26 at 08:08:52ID21865192
Tags

getprocaddress

Topic

Windows MFC Programming

Participating Experts
4
Points
250
Comments
16

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. typedef
    In the help of VC5(mk:@ivt:vclang/F8/DA/S1D8F1.HTM), I found the following lines ! typedef void fv( int ), (*pfv)( int ); /* typedef declarations */ void ( *signal( int, void (*) (int)) ) ( int ); fv *signal( int, fv * ); /* Uses typedef type */ pfv signal( int, pfv ); ...
  2. typedef void (*FUNC)() ????
    I've been tasked with figuring out a C program. Unfortunately I am not big on C (woe me) and worst of all there are no C references books around for me to use. If anyone can give me a brief tutorial (long explanation) as to what this line mean it would be appreciated. typed...
  3. printf
    In my compiler package there is a directory called include where all the header files are included.. Isn't there supposed to be a source file for every header file where functions are defined? I can't find anywhere the source files... for example I would be interested in see...
  4. LoadLibrary fails
    I have a .EXE which depends on DLL A. The .EXE uses LoadLibrary to load DLL B, which also depends on DLL A. The LoadLibrary call on DLL B failes, reporting "invalid access to memory location" in its static initializer. The static initializer for DLL B is using st...
  5. Running a function from a DLL, using LoadLibrary()
    Hello All I am trying to run a function using the LoadLibrary command. The Dll loads OK but the function does not run. The code is as follows: HINSTANCE hComponent = ::LoadLibrary(Get.dll) CREATEFUNCPTR CreateInstance = (CREATEFUNCPTR)::GetProcAddress(hComponent, “Hello...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: AndyAinscowPosted on 2006-05-26 at 08:21:57ID: 16769796

I think you have specified that the app is dependant on the three projects (one for each dll) when you built it.
Remove the dependancies before building.

 

by: mahesh1402Posted on 2006-05-26 at 08:28:22ID: 16769870

Where your DLL files are located ??

Try to Copy the required DLL to your project folder and check..

-MAHESH

 

by: newton-allanPosted on 2006-05-26 at 09:03:23ID: 16770138

There are four independent projects. There are no subprojects.

I've got the main app dependent on FirstDll.h, FirstDll.lib, SecondDll.h, SecondDll.lib, ThirdDll.lib, and ThirdDll.lib. Without those, it won't compile.

In main.dsp, I don't see any references to FirstDll.dll, SecondDll.dll, or ThirdDll.dll.

I put main.exe, FirstDll.dll, SecondDll.dll, and ThirdDll.dll in the same directory, and it works fine. When I rename SecondDll.dll to _SecondDll.dll, then I get the runtime error message about missing SecondDll.dll

And I'm baffled why these statements cause the _ASSERTE to fail:
   typedef const char* const (CALLBACK* GET_PROC)(USHORT);
   GET_PROC pGetBuf;
   pGetBuf  = (GET_PROC)GetProcAddress(hLibrary, "FirstGetBuf");
   _ASSERTE(pGetBuf != NULL);

I've looked at several websites and books with Windows dll examples, and they all use a typedef like the above to have GetProcAddress to work. I speculate if I could figure out how to have GetProcAddress to work ok, I could get rid of the (First|Second|Third)Dll.lib references and the (First|Second|Third)Dll.h statements.

I guess this is a variation on "dll hell" :-(

 

by: jkrPosted on 2006-05-26 at 09:52:01ID: 16770493

>>I guess this is a variation on "dll hell" :-(

No, it's  probably a variation of "C++ name mangling hell" ;o)

Make sure that you make that

#ifdef FIRSTINDLL_EXPORTS
#define FIRSTINDLL_API extern "C" __declspec(dllexport)
#else
#define FIRSTINDLL_API extern "C" __declspec(dllimport)
#endif

// Exported function.
FIRSTINDLL_API const char* const FirstGetBuf(USHORT Num);

otherwise the exported function will end up as

FirstGetBuf@US&NP

or something similar.

 

by: AndyAinscowPosted on 2006-05-26 at 10:01:23ID: 16770561

<I've got the main app dependent on FirstDll.h, FirstDll.lib, SecondDll.h, SecondDll.lib, ThirdDll.lib, and ThirdDll.lib. Without those, it won't compile.>

I can't see your project but it still sounds like what I said in my first comment - you have dependancies.  The way the app is compiled it EXPECTS ALL THREE dll's to be present and checks for them during startup, hence your crash.

 

by: newton-allanPosted on 2006-05-26 at 12:52:11ID: 16771931

> No, it's  probably a variation of "C++ name mangling hell" ;o)

I don't think so, because everything works ok with all three dll's are present. It runs fine. The problem is when one or more are missing.

> I can't see your project but it still sounds like what I said in my first comment - you have dependancies.  The way the app is compiled it EXPECTS ALL THREE dll's to be present and checks for them during startup, hence your crash.

I certainly agree, but I don't see ** how ** to remove the dependencies.  What am I doing or not doing that causes the app to insist that all three be present?

 

by: newton-allanPosted on 2006-05-26 at 13:19:52ID: 16772153

Here is a link to a vc6 project that has main and then three subprojects for the three .dll's
http://cleanspeech.sf.net/misc/EeLoadLib.zip

 

by: khunPosted on 2006-05-26 at 13:37:25ID: 16772267

When you load the libraries dynamically, you shouldn't declare their functions with __declspec(dllimport) at all, because that's what makes the application _demand_ their presence (I think)! Even if that's not correct, I think the following should work:

1. remove the includes of the three "xxxDll.h" in main.cpp
2. Put the:
    typedef const char* const (CALLBACK* GET_PROC)(USHORT);
   in main.cpp before void main(void). Could also go other places.
3. Do:

  GET_PROC pGetBuf;
   pGetBuf  = (GET_PROC)GetProcAddress(hLibrary, "FirstGetBuf");
   _ASSERTE(pGetBuf != NULL);
 
when FirstDll is successfully loaded.

You haven't shown where you have tried putting the GetProcAddress in your code, but if it's in that spot where you have commented it out, it couldn't work with dynamic loading, because the library was never loaded (hLibrary == NULL) or already released (else...FreeLibrary)!

 

by: khunPosted on 2006-05-26 at 13:43:06ID: 16772315

I forgot: I suspect you are linking with FirstDll.lib etc., you should remove that as well.

 

by: AndyAinscowPosted on 2006-05-26 at 13:52:06ID: 16772394

<I certainly agree, but I don't see ** how ** to remove the dependencies.  What am I doing or not doing that causes the app to insist that all three be present?>

Remove these from the project linking / external dependancies / whatever.  They should not appear anywhere in the settings of the project.  (From the dll's I think you still need to export them else no other app can get at them).

IF you only call the functions via a LoadLibrary method then it should compile.  Anywhere it doesn't is an indecation you are not using a LoadLibrary type approach.

 

by: newton-allanPosted on 2006-05-26 at 15:06:40ID: 16772806

I've tried a number of different things, and the core problem seems to be that the statement:
pGetBuf = GetProcAddress(hLibrary, "FirstGetBuf");
isn't working.

I'm obviously got something incorrectly setup in the FirstDll and/or the main project.

 

by: khunPosted on 2006-05-26 at 15:18:31ID: 16772856

Show us how you are using it now...

 

by: newton-allanPosted on 2006-05-26 at 17:53:58ID: 16773636

> No, it's  probably a variation of "C++ name mangling hell" ;o)
> .... use extern "C" ...

Well, I've been able to get it working. I first changed the (First|Second|Third).cpp files to .c files to avoid the name mangling. That helped * A LOT *. Then I went back and removed the (First|Second|Third).lib references and used the extern "C" as part of the typedef's.

Working fine now. If SecondDll.dll is missing, that LoadLibrary calls fails appropriately, but the main.exe is able to start without SecondDll.dll being present.

Thanks.

 

by: AndyAinscowPosted on 2006-05-26 at 23:47:09ID: 16774399

You always have the possibility to split points (your app was dependant via the lib references).

 

by: newton-allanPosted on 2006-05-27 at 04:38:47ID: 16775126

I thought about that ... was in a hurry and didn't take the time to see just how to split points. I'll do a "placeholder" question for 100 points and let you have it.
http://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_21865981.html

 

by: AndyAinscowPosted on 2006-05-27 at 04:43:49ID: 16775137

Thankyou.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...