Koen,
Sorry, took me a while to track down the cause. The problem was with
the IManagedProtocolSink.ManagedAppxxxxxx methods located in cEXWB.cs
file. It seems that under Reg-Free COM, any attempt to convert
IDispatch (param: sink) of ManagedAppBridge instance to
ComUtilitiesLib.IManagedAppBridge interface fails (returns null). I
have tested a workaround using InvokeMember and it seems to work under
Reg-Free COM without any problems.
Here is what you need to do:
1) In cEXWB.cs file, under "#region IManagedProtocolSink Members -
Asynchronous pluggable protocols (APP), via ComUtilitiesLib COM
library";
A) Add
/// <summary>
/// Helper method, called from
/// ManagedAppDownloadCompletedAsynch
/// CustomAppDownloadCompleted
/// </summary>
/// <param name="data">A reference to a variant wrapping a
byte array</param>
/// <param name="len">Length of byte array contained in data</
param>
/// <param name="Url"></param>
/// <param name="mimeType"></param>
/// <param name="sink">Object to invoke</param>
private void SendInvoke(ref object data, int len, string Url,
string mimeType, object sink)
{
try
{
object[] invkparam = new object[] { Url, mimeType,
data, len };
sink.GetType().InvokeMember("[DispID=1]",
BindingFlags.InvokeMethod, null, sink, invkparam);
}
catch (Exception)
{
throw;
}
}
B) Replace ManagedAppDownloadCompletedAsynch with
/// <summary>
/// Called from DownloadCompleted method of
DownloadRequestEventArgs
/// event argument passed to client via ProtocolHandlerOnStart
event
/// </summary>
/// <param name="data">Byte array representing downloaded data</
param>
/// <param name="redirectedUrl">Redirected url or the original</
param>
/// <param name="mimeType">Mime type of downloaded data</param>
/// <param name="sink">IManagedAppBridge instance</param>
void IManagedProtocolSink.ManagedAppDownloadCompletedAsynch(byte[]
data, string Url, string mimeType, object sink)
{
if (sink != null)
{
//Convert IDispatch of ManagedAppBridge instance to
ComUtilitiesLib.IManagedAppBridge interface
ComUtilitiesLib.IManagedAppBridge appsink = sink as
ComUtilitiesLib.IManagedAppBridge;
if (appsink != null)
{
object APPSinkData = data;
appsink.DownloadCompleteManaged(Url, mimeType, ref
APPSinkData, data.Length);
}
else
{
//Use invoke - Reg-Free COM
//"[DispID=1]"
try
{
object APPSinkData = data;
SendInvoke(ref APPSinkData, data.Length, Url,
mimeType, sink);
}
catch (Exception)
{
throw;
}
}
}
}
C) Replace ManagedAppDownloadCompletedAsynchNeedFileName with
void
IManagedProtocolSink.ManagedAppDownloadCompletedAsynchNeedFileName(string
Url, string mimeType, object sink, string CacheFileName)
{
if (sink != null)
{
ComUtilitiesLib.IManagedAppBridge appsink = sink as
ComUtilitiesLib.IManagedAppBridge;
if (appsink != null)
{
appsink.DownloadCompleteManagedCache(Url, mimeType,
CacheFileName);
}
else
{
//"[DispID=11]"
try
{
object[] invkparam = new object[] { Url, mimeType,
CacheFileName };
sink.GetType().InvokeMember("[DispID=11]",
BindingFlags.InvokeMethod, null, sink, invkparam);
}
catch (Exception)
{
throw;
}
}
}
}
D) Replace ManagedAppAbortDownload with
/// <summary>
/// Called from CancelDownloadRequest method of
DownloadRequestEventArgs
/// event argument passed to client via ProtocolHandlerOnStart
event
/// </summary>
/// <param name="Inet_Error_Code">One of Inet_Error_xxxx errors.
WinInetErrors enum can be used.</param>
/// <param name="sink">IManagedAppBridge instance</param>
void IManagedProtocolSink.ManagedAppAbortDownload(int
Inet_Error_Code, object sink)
{
if (sink != null)
{
ComUtilitiesLib.IManagedAppBridge appsink = sink as
ComUtilitiesLib.IManagedAppBridge;
if (appsink != null)
appsink.DownloadAbortManaged(Inet_Error_Code);
}
else
{
//"[DispID=2]"
try
{
object[] invkparam = new object[] { Inet_Error_Code };
sink.GetType().InvokeMember("[DispID=2]",
BindingFlags.InvokeMethod, null, sink, invkparam);
}
catch (Exception)
{
throw;
}
}
}
2) In cEXWB.cs file, under "#region ICustomProtocolSink Members";
A) Replace CustomAppDownloadCompleted with
void ICustomProtocolSink.CustomAppDownloadCompleted(byte[] data,
string Url, string mimeType, object sink)
{
if (sink != null)
{
ComUtilitiesLib.ICustManageApp custapp = sink as
ComUtilitiesLib.ICustManageApp;
if (custapp != null)
{
object APPSinkData = data;
custapp.DownloadCompleteCustomApp(Url, mimeType, ref
APPSinkData, data.Length);
}
else
{
try
{
//"[DispID=1]"
object APPSinkData = data;
SendInvoke(ref APPSinkData, data.Length, Url,
mimeType, sink);
}
catch (Exception)
{
throw;
}
}
}
}
B) Replace CustomAppAbortDownload with
void ICustomProtocolSink.CustomAppAbortDownload(int
Inet_Error_Code, object sink)
{
if (sink != null)
{
ComUtilitiesLib.ICustManageApp custapp = sink as
ComUtilitiesLib.ICustManageApp;
if (custapp != null)
custapp.DownloadAbortCustomApp(Inet_Error_Code);
}
else
{
try
{
object[] invkparam = new object[] { Inet_Error_Code };
sink.GetType().InvokeMember("[DispID=2]",
BindingFlags.InvokeMethod, null, sink, invkparam);
}
catch (Exception)
{
throw;
}
}
}
Regards,
MH
> >>>>>>
http://www.google.comfirstandthen to the silverlight page,