
Signature
Thanks in advance,
Juan Dent, M.Sc.
Hi Juan,
When dealing with VS2005 automation, one most possible cause of the
exception RPC_E_CALL_REJECTED you're seeing is because the IDE itself is
not ready to accept a request to call into the automation model. If your
client here implements IMessageFilter, you will see RejectType ==
SERVERCALL_RETRYLATER (2).
Therefore, the fix here is to implement IMessageFilter and handle
SERVERCALL_RETRYLATER to retry again in a short time:
// Definition of the IMessageFilter interface which we need to
implement and
// register with the CoRegisterMessageFilter API.
[ComImport(), Guid("00000016-0000-0000-C000-000000000046"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
interface IOleMessageFilter // Renamed to avoid confusion w/
System.Windows.Forms.IMessageFilter
{
[PreserveSig]
int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int
dwTickCount, IntPtr lpInterfaceInfo);
[PreserveSig]
int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int
dwRejectType);
[PreserveSig]
int MessagePending(IntPtr hTaskCallee, int dwTickCount, int
dwPendingType);
}
class Program : IOleMessageFilter
{
[DllImport("ole32.dll")]
private static extern int CoRegisterMessageFilter(IOleMessageFilter
newFilter, out IOleMessageFilter oldFilter);
[STAThread]
static void Main(string[] args)
{
Program program = new Program();
program.Register();
......
program.Revoke();
// to ensure the dte object is actually released, and the
devenv.exe process terminates.
GC.Collect();
GC.WaitForPendingFinalizers();
}
void Register()
{
IOleMessageFilter oldFilter;
CoRegisterMessageFilter(this, out oldFilter);
}
void Revoke()
{
IOleMessageFilter oldFilter;
CoRegisterMessageFilter(null, out oldFilter);
}
#region IOleMessageFilter Members
public int HandleInComingCall(int dwCallType, IntPtr hTaskCaller,
int dwTickCount, IntPtr lpInterfaceInfo)
{
return 0; //SERVERCALL_ISHANDLED
}
public int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount,
int dwRejectType)
{
if (dwRejectType == 2) // SERVERCALL_RETRYLATER
return 200; // wait 2 seconds and try again
return -1; // cancel call
}
public int MessagePending(IntPtr hTaskCallee, int dwTickCount, int
dwPendingType)
{
return 2; //PENDINGMSG_WAITDEFPROCESS
}
#endregion
}
For a complete example on this technique, please refer to following article:
#Chetan Chudasama's Weblog : Code to install Community Toolbox Controls
http://blogs.msdn.com/chetanc/archive/2006/01/19/515016.aspx
Hope this helps.
Sincerely,
Walter Wang (wawang@online.microsoft.com, remove 'online.')
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications. If you are using Outlook Express, please make sure you clear the
check box "Tools/Options/Read: Get 300 headers at a time" to see your reply
promptly.
Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
Walter Wang [MSFT] - 21 Feb 2007 05:23 GMT
MSDN library also has explanation on this:
#Fixing 'Application is Busy' and 'Call was Rejected By Callee' Errors
http://msdn2.microsoft.com/en-us/library/ms228772(VS.80).aspx
Regards,
Walter Wang (wawang@online.microsoft.com, remove 'online.')
Microsoft Online Community Support
==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.