c# - Implement IDownloadManger for my application only -


i'm using webbrowsercontrol in winforms application , have implemented own download manager following instructions here.

my custom download manager works, overrides download manager internet explorer, too*. there way have custom download manager appear when application running? or there way unregistered when application closes?

*i appreciate precisely point of implementing idownloadmanager, , webbrowser control just, essentially, internet explorer (which why have gone down route). custom download manager provides need, allowing me know has been downloaded , has been downloaded to.

after weeks of research, have managed piece together. posting here in hopes save trauma i've been through.

iserviceprovider.cs

using system; using system.collections.generic; using system.linq; using system.text; using system.runtime.interopservices;  namespace browserexample {     [comimport, comvisible(true)]     [guid("6d5140c1-7436-11ce-8034-00aa006009fa")]     [interfacetype(cominterfacetype.interfaceisiunknown)]     internal interface iserviceprovider     {         [return: marshalas(unmanagedtype.i4)]         [preservesig]         int queryservice(             [in] ref guid guidservice,             [in] ref guid riid,             [out] out intptr ppvobject);     }  } 

idownloadmanager.cs

using system; using system.collections.generic; using system.linq; using system.text; using system.runtime.interopservices; using system.runtime.interopservices.comtypes;  namespace browserexample {     [comvisible(false), comimport]     [guid("988934a4-064b-11d3-bb80-00104b35e7f9")]     [interfacetype(cominterfacetype.interfaceisiunknown)]     public interface idownloadmanager     {         [return: marshalas(unmanagedtype.i4)]         [preservesig]         int download(             [in, marshalas(unmanagedtype.interface)] imoniker pmk,             [in, marshalas(unmanagedtype.interface)] ibindctx pbc,             [in, marshalas(unmanagedtype.u4)] uint32 dwbindverb,             [in] int grfbindf,             [in] intptr pbindinfo,             [in, marshalas(unmanagedtype.lpwstr)] string pszheaders,             [in, marshalas(unmanagedtype.lpwstr)] string pszredir,             [in, marshalas(unmanagedtype.u4)] uint uicp);     } } 

downloadmanagerimplementation.cs

using system; using system.collections.generic; using system.linq; using system.text; using system.runtime.interopservices.comtypes; using system.windows.forms;  namespace browserexample {     [system.runtime.interopservices.comvisible(true)]     [system.runtime.interopservices.guid("bdb9c34c-d0ca-448e-b497-8de62e709744")]     public class downloadmanagerimplementation : idownloadmanager     {          /// <summary>         /// return s_ok (0) ie stop download file itself.          /// else default download user interface used.         /// </summary>         public int download(imoniker pmk, ibindctx pbc, uint dwbindverb, int grfbindf,            intptr pbindinfo, string pszheaders, string pszredir, uint uicp)         {             // display name of pointer imoniker interface specifies             // object downloaded.             string name = string.empty;             pmk.getdisplayname(pbc, null, out name);              if (!string.isnullorempty(name))             {                 uri url = null;                 bool result = uri.trycreate(name, urikind.absolute, out url);                  if (result)                 {                     //implement custom download manager here                     //example:                     //webdownloadform manager = new webdownloadform();                     //manager.filetodownload = url.absoluteuri;                     //manager.show();                     messagebox.show("download url is: " + url);                     return 0; //return s_ok                 }             }             return 1; //unspecified error occured.         }      } 

extendedbrowser.cs

using system; using system.collections.generic; using system.linq; using system.text; using system.windows.forms; using system.runtime.interopservices;  namespace browserexample {     public class extendedbrowser : webbrowser     {          protected sealed class webbrowsercontrolsite : webbrowser.webbrowsersite, iserviceprovider         {             downloadmanagerimplementation manager;              public webbrowsercontrolsite(webbrowser host)                 : base(host)             {                 manager = new downloadmanagerimplementation();              }              public int queryservice(ref guid guidservice, ref guid riid, out intptr ppvobject)             {                 guid sid_sdownloadmanager = new guid("988934a4-064b-11d3-bb80-00104b35e7f9");                 guid iid_idownloadmanager = new guid("988934a4-064b-11d3-bb80-00104b35e7f9");                  if ((guidservice == iid_idownloadmanager && riid == iid_idownloadmanager))                 {                     ppvobject = marshal.getcominterfaceforobject(manager, typeof(idownloadmanager));                     return 0; //s_ok                 }                 ppvobject = intptr.zero;                 return unchecked((int)0x80004002); //non_interface (use default, please)             }         }           protected override webbrowsersitebase createwebbrowsersitebase()         {             return new webbrowsercontrolsite(this);         }       } } 

to use it, instantiate extendedbrowser.

form1.cs

using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.windows.forms;  namespace browserexample {     public partial class form1 : form     {         public form1()         {             initializecomponent();         }          private void form1_load(object sender, eventargs e)         {             var browser = new extendedbrowser();             this.controls.add(browser);             browser.dock = dockstyle.fill;             browser.navigate("http://stackoverflow.com");         }     } } 

Comments