精华内容
下载资源
问答
  • 根据对IE、Maxtron、TT、世界之窗等...Delphi使用Webbrowser引起内存泄漏的原因是在OleCtrls.pas单元GetIDispatchProp和GetIntegerProp函数于对COM对象引用计数的错误处理上。 参见OleCtrls.pas源代码:   
    根据对IE、Maxtron、TT、世界之窗等浏览器的观察,可以肯定目前在所有的语言中如果调用Webbrowser这个ActiveX组件普遍存在内存泄漏问题。Delphi使用Webbrowser引起内存泄漏的原因是在OleCtrls.pas单元GetIDispatchProp和GetIntegerProp函数于对COM对象引用计数的错误处理上。

    参见OleCtrls.pas源代码: 

     


     1function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
     2var
     3  Temp: TVarData;
     4begin
     5  GetProperty(Index, Temp);
     6  Result := IDispatch(Temp.VDispatch);  //错误,COM对象赋值操作会增加对象的引用计数
     7end;
     8
     9function TOleControl.GetIUnknownProp(Index: Integer): IUnknown;
    10var
    11  Temp: TVarData;
    12begin
    13  GetProperty(Index, Temp);
    14  Result := IUnknown(Temp.VUnknown);   //错误,COM对象赋值操作会增加对象的引用计数
    15end;

     

    由于该错误代码会影响到所有继承TOleControl的组件,使其内存泄漏,所以我建议修改TOleControl的代码并重新编译OleCtrls.pas单元。该成如下的样子,即可解决问题。


     1function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
     2var
     3  Temp: TVarData;
     4begin
     5  GetProperty(Index, Temp);
     6  //Result := IDispatch(Temp.VDispatch);
     7  Pointer(Result) := Temp.VDispatch;  //强制转换成Pointer再赋值就不会增加引用计数了
     8end;
     9
    10function TOleControl.GetIUnknownProp(Index: Integer): IUnknown;
    11var
    12  Temp: TVarData;
    13begin
    14  GetProperty(Index, Temp);
    15  //Result := IUnknown(Temp.VUnknown);
    16  Pointer(Result) := Temp.VUnknown;  //强制转换成Pointer再赋值就不会增加引用计数了
    17end;
    18
    19

    问题分析:

    该问题由来已久,自Delphi6(我用的第一个Delphi版本,之前版本是否存在不确定)到Delphi2009,OleControl.pas始终存在该问题。修改之后可以解决内存泄漏问题,但Borland为何迟迟不进行更正呢?该内存泄漏对于一个需要频繁创建、操作和释放Ole对象的程序来说,是致命的。例如Doc:=Browser.Document as IHTMLDocument2这个语句就会引发GetDispachProp的执行,由于引用计数被错误的增加,对象不被使用时引用计数仍为1,所以该对象(Doc)不会被释放,进而引发内存泄漏。

    由于Borland迟迟未能修复此问题,一些第三方组件例如:TEmbeddedWB,被动的去掉用_Release方法额外减少引用计数,已达到引用计数的平衡,我不太喜欢这样的做法,因为一旦该Bug被Borland或用户自行修复(我就自行修改了OleControl.pas),_Release将会导致引用计数向另一个更危险的方向偏移,Ole对象仍被使用的时候,引用计数已经归零,于是Ole对象被释放,接着是一个AV错误(Access violation错误)被引发。

    下篇文章会详细介绍TEmbeddedWB如何被动的修复此漏洞。

    展开全文
  • 方法1:在网页加载完毕后的事件里面添加代码,我这里只是修改网页不出现滚动条,因为滚动条我重写了。 1 #region (private) 网页加载完成后执行回调的函数 2 3 /// <summary> 4 /// 网页加载完成...

    如何更改 WebBrowser所加载的 HTML元素

    方法1:在网页加载完毕后的事件里面添加代码,我这里只是修改网页不出现滚动条,因为滚动条我重写了。

     

     1 #region (private)  网页加载完成后执行回调的函数
     2 
     3         /// <summary>
     4         /// 网页加载完成后执行回调的函数,在这初始化滚动条的参数
    5         /// </summary>
     6         private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
     7         {
     8             if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
     9             {
    10                 HtmlElementCollection  bodys= this.webBrowser1.Document.GetElementsByTagName("body");
    11                 HtmlElement body=null;
    12                 if (bodys.Count>0) 
    13                      body=bodys[0];
    14                 if( body != null )
    15                 {
    16                     if( body.Style != null )
    17                         body.Style += " overflow: hidden; ";
    18                     else
    19                         body.Stle = " overflow: hidden; ";
    20                 }
    21            }
    40         }
    41         #endregion

     

    方法2:直接对DocumentTex内容进行修改

     1  private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
     2         {
     3             if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
     4             {
     5                 try
     6                 {
     7                     string strHTML= this.webBrowser1.DocumentText;
     8                     strHTML = "这里修改你要动的地方";
     9                     this.webBrowser1.DocumentText = strHTML;
    11                 }
    12                 catch
    13                 {
    14                 }
    15 
    16             }
    17         }

    方法3:大伙常说的  

               this.webBrowser1.Document.Body.SetAttribute( "scroll","no");

    总结:        在这里说明一下此方法跟第一种方法的区别, 第一种方法修改后,在呈现的网页右键查看源代码是看不到修改后的内容,
               但在webBrowser1.Document.Body.OuterHtml属性里面可以看的到,
               第二种方法修改后则右键查看源代码也可看的到,有关其它更深入的区别,作为菜鸟的我还是没有去关心了,

               方法3,不是很灵活,有时还没用

               我用的是第一种方法

    转载于:https://www.cnblogs.com/fj99/p/4218801.html

    展开全文
  • 近期需要对webbrower设置代理,找到了如下方案: 1. 对修改注册表,设置全局代理 ...通过函数InternetSetOption实现修改当前程序中的WebBrowser设置 1 static class WebBrowserProxy 2 3 { 4 ...

    近期需要对webbrower设置代理,找到了如下方案:

    1.

    对修改注册表,设置全局代理

    这种方法限制在一个进程内只能设置或取消代理,而且是全局代理,对于部分不需要代理对功能会产生影响

     

    2.

    通过函数InternetSetOption实现修改当前程序中的WebBrowser设置

     1 static class WebBrowserProxy
     2  
     3 {
     4  
     5     struct Struct_INTERNET_PROXY_INFO
     6  
     7     {
     8  
     9         public int dwAccessType;
    10  
    11         public IntPtr proxy;
    12  
    13         public IntPtr proxyBypass;
    14  
    15     };
    16  
    17  
    18  
    19     [DllImport("wininet.dll", SetLastError = true)]
    20  
    21     static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer,int lpdwBufferLength);
    22  
    23  
    24  
    25     public static void SetProxy(string strProxy = "127.0.0.1:8888")
    26  
    27     {
    28  
    29         const int INTERNET_OPTION_PROXY = 38;
    30  
    31         const int INTERNET_OPEN_TYPE_PROXY = 3;
    32  
    33  
    34  
    35         Struct_INTERNET_PROXY_INFO struct_IPI;
    36  
    37  
    38  
    39         // Filling in structure
    40   
    41        struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    42  
    43         struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
    44  
    45         struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");
    46  
    47  
    48  
    49         // Allocating memory
    50  
    51         IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));
    52  
    53  
    54  
    55         // Converting structure to IntPtr
    56  
    57         Marshal.StructureToPtr(struct_IPI, intptrStruct, true);
    58  
    59         bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI));
    60  
    61     }
    62  
    63 }

     

    参考来源“https://blog.csdn.net/gold0523/article/details/38666701”

    转载于:https://www.cnblogs.com/yishilin/p/9513207.html

    展开全文
  • 我们用WebBrowser控件的时候,有时需要对它使用代理服务器。 一种常规的做法是修改全局IE代理...另外一种方式是通过函数InternetSetOption实现修改当前程序中的WebBrowser设置,使用方式如下: 代码 static...

    我们用WebBrowser控件的时候,有时需要对它使用代理服务器。

    一种常规的做法是修改全局IE代理设置。这种方式可以通过修改注册表实现,但这样做就把所有的IE引擎都给设置了,网上介绍的大都是这种方法,并且往往并不是我所想要的效果,这里就不介绍了。

    另外一种方式是通过函数InternetSetOption实现修改当前程序中的WebBrowser设置,使用方式如下:

    ExpandedBlockStart.gif代码
    static class WebBrowserProxy
    {
        
    struct Struct_INTERNET_PROXY_INFO
        {
            
    public int dwAccessType;
            
    public IntPtr proxy;
            
    public IntPtr proxyBypass;
        };

        [DllImport(
    "wininet.dll", SetLastError = true)]
        
    static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

        
    public static void SetProxy(string strProxy = "127.0.0.1:8000")
        {
            
    const int INTERNET_OPTION_PROXY = 38;
            
    const int INTERNET_OPEN_TYPE_PROXY = 3;

            Struct_INTERNET_PROXY_INFO struct_IPI;

            
    // Filling in structure 
            struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
            struct_IPI.proxy 
    = Marshal.StringToHGlobalAnsi(strProxy);
            struct_IPI.proxyBypass 
    = Marshal.StringToHGlobalAnsi("local");

            
    // Allocating memory 
            IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));

            
    // Converting structure to IntPtr 
            Marshal.StructureToPtr(struct_IPI, intptrStruct, true);

            
    bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI));
        }
    }

     

     

    展开全文
  • winform控件webbrowser和js脚本互调 默认分类 2007-09-06 22:40:...修改webbrowser的属性使c#可以调用js方法:  webBrowser1.ObjectForScripting = this; 如果要传值,则可以定义object[]数组。 具体方法如下例
  • Sidyhe在http://blog.csdn.net/sidyhe/article/details/9073485一文中,利用C++以及WindowsSDK实现了WebBrowser控件的容器。我们可以在Sidyhe的基础上,简单修改CXWebBrowser类...具体实现只要修改Invoke函数即可,...
  • 修改webbrowser的属性使c#可以调用js方法: webBrowser1.ObjectForScripting = this; 如果要传值,则可以定义object[]数组。 具体方法如下例子: 首先在js中定义被c#调用的方法: function Messageaa(message) ...
  • 我们用WebBrowser控件的时候,有时需要对它使用代理服务器。   一种常规的做法是修改全局IE代理设置。...另外一种方式是通过函数InternetSetOption实现修改当前程序中的WebBrowser设置,使用方式如下:
  • 转载请注明出处   WebBrowser简单易用,少量代码可以实现不错的功能,但貌似没有一个完美的方法设置代理 可以设置全局代理,通过注册表或者函数修改IE代理,但这样无法实现同时多个WebBrowser使用不同...
  • 出处:... 作者:zys2008003 winform控件webbrowser和js脚本互调 1)在c#中调用js函数 修改webbrowser的属性使c#可以调用js方法: webBrowser1.ObjectForScripting = this; 如...
  • 让这个webBrowser1.Document.InvokeScript()函数纠结了我半天,因为js也是刚刚接触,所以不知道问题出在哪,在这跟大家分享一下,免得走很多弯路: 首选我在dw 中谢啦 一个 function: //公交站点对点的搜索函数,...
  • delphi开发修改并提交Web表单内容

    千次阅读 2007-07-15 16:22:00
    程序代码主要是通过WebBrowser控件来实现修改并提网页表单内容,FillSelectForm函数是实现修改选择框的内容,以下是实现函数程序代码:function TForm1.FillSelectForm(WebBrowser: TWebBrowser; FieldName: string;...
  • 学习笔记40

    2020-07-12 10:15:07
    1、修改程序以使用函数:创建一个目录来保存漫画,并定义downloadxkcd()来循环遍历指定范围中的所有编号; 2、创建并启动线程:创建多个线程并且使每个线程都调用downloadXkcd(); 3、等待所有程序结束:调用Thread...
  • 上一个版本中我是通过Web应用程序调用 WinForm 中的函数进行打印,WinForm中嵌套了 WebBrowser 来浏览网页,通过这几年的实际运用,这个方法基本能够满足大部分需求,但还是美中不足,由于 WebBrowser 所示用的...
  • 三、修改Alexa工具条的代码 熟悉IE编程的人都知道,DWebBrowserEvents2接口是用来接收WebBrowser的事件通知的,我们可以在AlxRes.dll的javascript代码中找到这些些对应的函数。在res://AlxRes.dll/SCRIPT/EVT.CLASS....
  • C++回调C#里面的函数,C++里面用的是函数指针,但C#里面只能用委托了。造成错误。 参考:http://www.debugease.com/csharp/3532235.html 该文章提出解决方案: 在声明委托前要加上这句: ...
  • 21.3.5 使用WebBrowser控件 21.3.6 Winning应用程序的操作 21.3.7 添加上下文菜单 21.3.8 创建事件处理程序 21.3.9 处理Limits菜单的事件 21.3.10 创建对话框 21.3.11 使用对话框 21.3.12 添加第二个对话框 21.3.13 ...
  • 21.3.5 使用WebBrowser控件 21.3.6 Winning应用程序的操作 21.3.7 添加上下文菜单 21.3.8 创建事件处理程序 21.3.9 处理Limits菜单的事件 21.3.10 创建对话框 21.3.11 使用对话框 21.3.12 添加第二个对话框 21.3.13 ...
  • 21.3.5 使用WebBrowser控件 21.3.6 Winning应用程序的操作 21.3.7 添加上下文菜单 21.3.8 创建事件处理程序 21.3.9 处理Limits菜单的事件 21.3.10 创建对话框 21.3.11 使用对话框 21.3.12 添加第二个对话框 21.3.13 ...
  • 21.3.5 使用WebBrowser控件 21.3.6 Winning应用程序的操作 21.3.7 添加上下文菜单 21.3.8 创建事件处理程序 21.3.9 处理Limits菜单的事件 21.3.10 创建对话框 21.3.11 使用对话框 21.3.12 添加第二个对话框 21.3.13 ...
  • 21.3.5 使用WebBrowser控件 21.3.6 Winning应用程序的操作 21.3.7 添加上下文菜单 21.3.8 创建事件处理程序 21.3.9 处理Limits菜单的事件 21.3.10 创建对话框 21.3.11 使用对话框 21.3.12 添加第二个对话框 21.3.13 ...
  • 21.3.5 使用WebBrowser控件 21.3.6 Winning应用程序的操作 21.3.7 添加上下文菜单 21.3.8 创建事件处理程序 21.3.9 处理Limits菜单的事件 21.3.10 创建对话框 21.3.11 使用对话框 21.3.12 添加第二个对话框 21.3.13 ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 103
精华内容 41
关键字:

webbrowser修改函数