How to Link to a function from a DLL loaded by a DLL?
1828 Репутация автора
I'm using VS2010 and I have a layered application that looks like this:
app.exe DLL1.dll DLL2.dll
where app.exe loads DLL1 and it then loads DLL2. I want my app to call a function in DLL2 like so
DLL2::setvariable( value ).
I've set this up properly in my vc6 workspace without having to specify the lib file for
DLL2.dll. How can I set this up in my VS2010 environment? I keep getting an unresolved symbol linker error for all the calls to
I've tried to include
#pragma comment(lib ,"DLL2.lib")
DLL1.dll and it links but does this load
DLL2.dll and all its variables twice?
934 Репутация автора
A DLL is only loaded once in an application's address-space. This is by Windows design. An import-library for a dll loads the dll (
LoadLibrary()) and assigns local function names to the dll functions. You could do the same yourself by calling
According to the Documentation:
The system maintains a per-process reference count on all loaded modules. Calling LoadLibrary increments the reference count. Calling the FreeLibrary or FreeLibraryAndExitThread function decrements the reference count. The system unloads a module when its reference count reaches zero or when the process terminates (regardless of the reference count).
So no, a DLL is only loaded once, only its "UseCount" is set to 2.
I've set this up properly in my vc6 workspace without having to specify the lib file for DLL2.dll
I guess you weren't calling
DLL2::setvariable( value ) from
app.exe then, otherwise how did you do it?
Is this the right way to do it?
This is one way to do it (though you could simply include the
lib into the project - as most developers do - instead of using the
#pragma, but the rseult is the same). The other alternative is call
GetProcAddress() yourself (useful if you want to conditionally load the dll). There's no other way i'm aware of.