ATL: ATL events question

I have a COM VC++ server which fires events and a VC++ client which catching the event using an ATL sink (IDispEventImpl). I have a SINK_MAP in the client, and the events are recieved OK.
My question is:
In the client I'm using #import to the .tlb/.dll of the server. If I do not use "named_guids" attribute, then I do
not get the events. Are the "named_guids" is a must attribute to recieve events ???

If it is a must then I have a second problem:
My server contains several Dll's, and inorder to make the client simpler I use the "rename_namespace" attribute to one common name:
#import "MyDll1.tlb" rename_namespace ("MyProj")
#import "MyDll2.tlb" rename_namespace ("MyProj")
#import "MyDll3.tlb" rename_namespace ("MyProj")
Now, when trying to add the "named_guids" attribute to each one of the "import" lines, I fail in compilation:
"'LIBID_MyProj' : redefinition; multiple initialization... "

Can someone please advise ???
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.


I'm not that expert in COM programming, but I have a suggestion. Try to put the imports in the client code like this:

     #import "MyDll1.tlb" rename_namespace ("MyProj1")
     #import "MyDll2.tlb" rename_namespace ("MyProj2")
     #import "MyDll3.tlb" rename_namespace ("MyProj3")

Then put:

     using namespace MyProj1;
     using namespace MyProj2;
     using namespace MyProj3;

Then add the "named_guids" attribute and try to compile.

Khalid Omar.
yoavoAuthor Commented:
This will probably work, but as I mentioned before I want all the Dll's to be renamed to one name.
Your problem is the precise reason why libraries have their own namespaces in the first place.

[un]Fortunately, there is a solution to your problem.

[this post may be wrapped - if so unwrap it!!]

#import "MyDll1.tlb" rename_namespace ("MyProj") rename("LIBID_MyProj","LIBID_MyProj1") named_guids
#import "MyDll2.tlb" rename_namespace ("MyProj") rename("LIBID_MyProj","LIBID_MyProj2") named_guids
#import "MyDll3.tlb" rename_namespace ("MyProj") rename("LIBID_MyProj","LIBID_MyProj3") named_guids
Bootstrap 4: Exploring New Features

Learn how to use and navigate the new features included in Bootstrap 4, the most popular HTML, CSS, and JavaScript framework for developing responsive, mobile-first websites.

yoavoAuthor Commented:
I tried it but it doesn't work. I still get the compile error message.
With the exact same error ??

"'LIBID_MyProj' : redefinition; multiple initialization... "
yoavoAuthor Commented:
Try excluding the LIBIDs, as they're generally never referenced anyway.

[this post may be wrapped - if so unwrap it!!]

#import "MyDll1.tlb" rename_namespace ("MyProj") exclude("LIBID_MyProj") named_guids
#import "MyDll2.tlb" rename_namespace ("MyProj") exclude("LIBID_MyProj") named_guids
#import "MyDll3.tlb" rename_namespace ("MyProj") exclude("LIBID_MyProj") named_guids
yoavoAuthor Commented:
I still get the same error...
Just noticed an error in my orignal post. Sorry.

[this post may be wrapped - if so unwrap it!!]

#import "MyDll1.tlb" rename_namespace ("MyProj") rename("MyProjLib","MyProjLib1") named_guids
#import "MyDll2.tlb" rename_namespace ("MyProj") rename("MyProjLib","MyProjLib2") named_guids
#import "MyDll3.tlb" rename_namespace ("MyProj") rename("MyProjLib","MyProjLib3") named_guids

The LIBID don't even exist yet, so you can't rename them. It should be the name of the library itself.

In your original IDL, you should have:
    helpstring("blah Type Library")
library MyProjLib  //*** this is the name you want to specify for rename
yoavoAuthor Commented:
"MyProjLib" is not written in any idl !!!
"MyProj" is just a name that the client renamed for easy access to the tlb's of the client.
Yes, but those original tlb files must have been generated from source. It's that source that you need to view, to ascertain what name it is you're wanting to rename in the first place.

It is likely to be the original namespace name.
yoavoAuthor Commented:
I tried it. still I get the same error...
Finally got to the bottom of your error.

rename_namespace renames the would-be library clause within the original IDL. Therefore trying to rename them all to a common name will simply not work [I learned something here as well].

I composed a simple test project, and all went well. So here is what you'll need to do to give them a common namespace.

// Let everything retain their original namespaces
#import "MyDll1.tlb" named_guids
#import "MyDll2.tlb" named_guids
#import "MyDll3.tlb" named_guids

// Bring everything into the scope of namespace MyProj
namespace MyProj
    using namespace MyProj1; //*** this  is whatever the original namespace is
    using namespace MyProj2;
    using namespace MyProj3;

After this MyProj will have everything defined within it. Of course everything is still accessible from within the original namespaces as well, but at least they're also visible from the common namespace.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Development

From novice to tech pro — start learning today.