var
FHTTPObj: OleVariant;
begin FHTTPObj := CreateOleObject('WinHttp.WinHttpRequest.5.1');  log(3);
     // FHTTPObj.Charset :='GB2312';
  FHTTPObj.setTimeouts(50000, 50000, 50000, 50000);
  FHTTPObj.Open('GET', 'https://www.baidu.com/', False);
  FHTTPObj.SetRequestHeader('User-Agent', MyUserAgent);
  FHTTPObj.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
end;这个函数 放在线程下 程序就崩溃 放在BUTTON主程序下 就完全没问题,请教哪出了问题多线程gb2

解决方案 »

  1.   

    试下这样:
    uses ActiveX;
    var
     FHTTPObj: OleVariant;
    begin
      coInitialize(nil);
      try
      FHTTPObj := CreateOleObject('WinHttp.WinHttpRequest.5.1');
     
      log(3);
          // FHTTPObj.Charset :='GB2312';
       FHTTPObj.setTimeouts(50000, 50000, 50000, 50000);
       FHTTPObj.Open('GET', 'https://www.baidu.com/', False);
       FHTTPObj.SetRequestHeader('User-Agent', MyUserAgent);
       FHTTPObj.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      finally
        CoUninitialize;
      end;
     end;
      

  2.   

    线程中要单独初始化COM环境——CoInitialize
      

  3.   

    前几天也才纠结这个问题,为了完成任务就直接不用线程了。
    又记得在某群里正好也见过讨论,昨天重写了下代码,就是用的coInitialize初始化com组件
      

  4.   

    多谢上面3位大哥 可以了 不过有另一个问题type
      Scaner = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;
    procedure Scaner.Execute;
    var
    i:Integer;
    begin
    for i := 0 to 100 do  begin
      Sleep(100);
      end;
    end;
    procedure TForm1.Button4Click(Sender: TObject);
    var
    s:Tscan;
    begin
      s:=Tscan.Create;
      s.Execute;
    end;这样启动线程 为什么会卡主程序啊
      

  5.   

    把s.Execute;这句去掉!你那样的话相当于是把线程的执行代码搬到主线程里执行了,当然会卡到主界面。线程Create以后会自动调用Execute的(除非Create参数传False),不用你再去调用。