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
Post a Comment