plucked
plucked

Reputation: 511

C++ How to communicate between DLLs of an application?

I have a application and two Dlls. Both libraries are loaded by the application. I don't have the source of the application, but the source of the libs. I want to instantiate a class in lib A and want to use this instance also in lib B.

How do I do this? I'm not sure, but I think that both libs are used in different threads of the application.

I have no idea where I have to search for a solution.

Upvotes: 1

Views: 4825

Answers (5)

Fozi
Fozi

Reputation: 5135

You have to realize that even though your DLLs are used by the host application nothing prevents you (that is your DLLs) from using your DLLs as well. So in your DLL A you could load and use your DLL B and call functions and stuff. When DLL A is unloaded, free DLL B as well. DLLs are reference counted, so your DLL A will have a reference of 1 (the host application) and your DLL B 2 (the host application and DLL A). You will not have two instances of DLL B loaded in the same process.

Upvotes: 1

Elemental
Elemental

Reputation: 7466

Seems the simple solution would be to include in some initialization function of library A (or in DllMain if needed) a simple call to a function in library B passing a pointer to the common object. The only caveat is that you must ensure the object is deleted by the same DLL that newed it to avoid problems with the heap manager.

If these DLL's are in fact used in different threads you may have to protect access to said data structure using some kind of mutex.

Upvotes: 0

morechilli
morechilli

Reputation: 9817

Two dll's loaded into the same process is a fairly simple setup. You just need to be careful with module scope, which will be the same as dll scope. e.g. each dll will have its own set of static instances for any static objects. Next you need to understand how to reference functions/classes across the boundary and what sort of types are safe to use as arguments.

Have a look on any documentation for dllexport and dllimport - there are several useful questions on this site if you search with those terms.

Upvotes: 1

cwap
cwap

Reputation: 11267

Named pipes might be the solution to your problems.

If you're targetting windows, you can check this reference

[EDIT] Didnt see you wanted to work on the same instance. In that case you need shared memory spaces, however, you really have to know what you're doing as it's quite dangerous :) A better solution could be to apply OO Networking principles to your libs and communicate with, say CORBA, using interprocess middleware or the 127.0.0.1 loopback interface (firewalls will need to allow this).

Upvotes: 0

Andrejs Cainikovs
Andrejs Cainikovs

Reputation: 28424

No. Think about DLL as just normal library. Both can be used in a single thread.
If you want to use a class A in library X, you must pass a pointer/reference to it. The same applies to library Y. This way both libraries can work with same class/data.

Upvotes: 1

Related Questions