有这样一个函数
procedure TForm1.DomImg2Image(src:string;wb:TWebBrowser);
var
  i:Integer;
  rang:IHTMLControlRange;
  img:TImage;
  gimg: TJPEGImage;
  ss:string;
begin
  for i:=0 to IHTMLDocument2(wb.Document).images.length-1 do
    if Pos(src,(IHTMLDocument2(wb.Document).images.item(i,EmptyParam)as
      IHTMLElement).getAttribute('src',0))>0 then
    begin
      rang:=((IHTMLDocument2(wb.Document).body as HTMLBody).createControlRange)as
        IHTMLControlRange;
      rang.add(IHTMLDocument2(wb.Document).images.item(i,EmptyParam) as
        IHTMLControlElement);
      rang.execCommand('Copy',False,0);
      img:=TImage.Create(nil);
      img.Picture.Assign(ClipBoard);
      gimg:=TJPEGImage.Create;
      gimg.Assign(img.Picture.Graphic);
      ss:='C:\'+ FormatDateTime('yyyymmddhhnnsszzz',now()) +'.bmp';
      gimg.SaveToFile(ss);
//      try img.Picture.Assign(ClipBoard)except end;
      break;
    end;
end;是想保存webbrowser控件里的图片,在单线程的时候执行正常,但放到多线程中,rang.execCommand('Copy',False,0);这句总是返回false,执行不成功,想请教一下,这个有什么办法解决,或者提供一下execCommand的源码,又或者有没有其它的方法可以保存图片?

解决方案 »

  1.   

    多线程中对同一个WebBrowser操作要同步,不能同时访问,你可以每个线程中创建一个WebBrowser
      

  2.   

    想办法获取图片的url。下载下来就保存了哈~
      

  3.   

    只要 获取 到图片的 url地址 
    有个 urlmon 组件  用httpdownload 直接就下载了 
      

  4.   

    你的问题待查,但你的代码本身就有误。 gimg:=TJPEGImage.Create;
      gimg.Assign(img.Picture.Graphic);
      ss:='C:\'+ FormatDateTime('yyyymmddhhnnsszzz',now()) +'.bmp';//注意一个TJPEGImage怎么能保存成bmp类型的文件呢?
      gimg.SaveToFile(ss);
      

  5.   

    TJPEGImage,不是等于直接把jpeg格式后缀改到bmp吗?是有些程序是修改后缀后打不开,用Timage控件加载会出错,这里还好,因为图片是程序生成,程序处理,所以没有报错,运行正常。
      

  6.   

    最后问题其实很简单,在线程开始加上 CoInitialize(nil);结束加上CoUnInitialize; 就正常了,是因为com没有初始化引起的