Hi All,
I have a Inproc COM-server called by a .Net client.
While tracing my addref/release calls I noticed some strange behaviour.
The COM server with treadingmodel "both" has the following (simplified)IDL
interface INetTestB : IDispatch
{
STDM Doit (void);
};
interface INetTestA : IDispatch
{
STDM Doit ([in]INetTestB *a);
};
coclass NetTestA
{
[default] interface INetTestA;
};
coclass NetTestB
{
[default] interface INetTestB;
};
I use following code in the dotnet client:
NetTestB b = new NetTestBClass();
NetTestA a = new NetTestAClass();
//X
a.Doit(b);
//Y
a.Doit(b);
//Z
Before X the is a heavy comunication with QI's addrefs, etc, which is
understandable I thing.
But between X and Y there is also excessive use of COM-functions:
Addref NetTestB0.2.2.344 (03E12738): 4(glob), 2
QueryInt NetTestB0.2.2.344 (03E12738): iid=INetTestB
Addref NetTestB0.2.2.344 (03E12738): 4(glob), 3
QueryInt NetTestB0.2.2.344 (03E12738): ptr=03E12708, ret=0
Release NetTestB0.2.2.344 (03E12738): 4(glob), 2
Addref NetTestB0.2.2.344 (03E12738): 4(glob), 3
Addref NetTestA0.2.2.344 (03E12818): 4(glob), 2
QueryInt NetTestA0.2.2.344 (03E12818): iid=INetTestA
Addref NetTestA0.2.2.344 (03E12818): 4(glob), 3
QueryInt NetTestA0.2.2.344 (03E12818): ptr=03E127E8, ret=0
Release NetTestA0.2.2.344 (03E12818): 4(glob), 2
Addref NetTestA0.2.2.344 (03E12818): 4(glob), 3
--> COMSERVER-code NetTestA::Doit: this=03E127E8, parm=03E12708
--> COMSERVER-code NetTestB::Doit: this=03E12708
Release NetTestB0.2.2.344 (03E12738): 4(glob), 2
Release NetTestA0.2.2.344 (03E12818): 4(glob), 2
Between Y and Z the addrefs/releases are a bit relaxed, but still,
unnescessary addrefs/releases occurr:
Addref NetTestB0.2.2.344 (03E12738): 4(glob), 3
Addref NetTestA0.2.2.344 (03E12818): 4(glob), 3
--> COMSERVER-code NetTestA::Doit: this=03E127E8, parm=03E12708
--> COMSERVER-code NetTestB::Doit: this=03E12708
Release NetTestB0.2.2.344 (03E12738): 4(glob), 2
Release NetTestA0.2.2.344 (03E12818): 4(glob), 2
Seems to me that the code between X and Y checks how the interfaces should
be marshalled, but the way they do it is not very cheap. Anyway, I don't
understand the addref/release between Y and Z at all.
My questions:
1) Why are the addref/release done each call?
2) How can I get rid of them
Any comments? Or pointers to documentation?
Thanx,
Peter
===================================
This list is hosted by DevelopMentorĀ® http://www.develop.com
View archives and manage your subscription(s) at http://discuss.develop.com