After doing more research into this problem, I think I know what is
going wrong. According to the Dependency Walker documentation there
are 5 different types of module dependencies.

1. Implicit Dependency (also known as a load-time dependency or
sometimes incorrectly referred to as static dependency): Module A is
implicitly linked with a LIB file for Module B at compile/link time,
and Module A's source code actually calls one or more functions in
Module B.  Module B is a load time dependency of Module A and will be
loaded into memory regardless if Module A actually makes a call to
Module B at run-time.  Module B will be listed in Module A's import
table.

2. Delay-load Dependency: Module A is delay-load linked with a LIB
file for Module B at compile/link time, and Module A's source code
actually calls one or more functions in Module B.  Module B is a
dynamic dependency and will only be loaded if Module A actually makes
a call to Module B at run-time.  Module B will be listed in Module A's
delay-load import table.

3. Forward Dependency: Module A is linked with a LIB file for Module B
at compile/link time, and Module A's source code actually calls one or
more functions in Module B.  One of the functions called in Module B
is actually a forwarded function call to Module C.  Module B and
Module C are both dependencies of Module A, but only Module B will be
listed in Module A's import table.

4. Explicit Dependency (also known as a dynamic or run-time
dependency): Module A is not linked with Module B at compile/link
time.  At runtime, Module A dynamically loads Module B via a
LoadLibrary type function.  Module B becomes a run time dependency of
Module A, but will not be listed in any of Module A's tables.  This
type of dependency is common with OCXs, COM objects, and Visual Basic
applications.

5. System Hook Dependency (also known as an injected dependency): This
type of dependency occurs when another application hooks a specific
event (like a mouse event) in a process.  When that process produces
that event, the OS can inject a module into the process to handle the
event.  The module that is injected into the process is not really a
dependent of any other module, but does resides in that process'
address space.

It appears to me that currently when I link my application against
FileIO.lib and ImageFileIO.lib I am creating a Delay-load dependency.
So because the user will never call any functions in either of these
libraries, there are not loaded into memory. If this is correct then
we need to either create an Implicit Dependency, which I have no idea
how to do, or start using a more traditional plugin architecture and
an explicit dependency.

Does anyone that might know more about this have anything to add? Does
anyone know how to create an implicit dependency? How do people feel
about a more traditional plugin system that would search a directory
on disk calling LoadLibrary on each file in
path/to/opensg/lib/plugins? I personally would like to get away from
relying on static data initialization in order to do plugin
registration. So for example each plugin would define a C function
call that returns an instance of it's internal image/model loading
class. Then we could load each library in a plugin directory, look for
the correct symbol, and then explicitly get a reference to an image
loader.

Thanks,
Aron

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to