大家帮我测试一下这个线程,为什么会错误,不是线程就对! (100分)

  • 主题发起人 主题发起人 一只笨小狗
  • 开始时间 开始时间

一只笨小狗

Unregistered / Unconfirmed
GUEST, unregistred user!
这个函数放在一个unit文件,uses到线程里使用,就出错,
如果在form1下使用,就对了,为什么?

线程代码代码如下,大家看看哪里出错了?
unit Unit2;

interface

uses
Classes, Activex, SHDocVw_TLB, mshtml,Variants;

type
TTestIE = class(TThread)
private
{ Private declarations }
procedure IEWrite(const webbrowser: Twebbrowser
const content: string);
protected
procedure Execute
override;
end;

implementation
uses
Unit1;
{ TTestIE }

procedure TTestIE.Execute;
begin
{ Place thread code here }
CoInitialize(nil);
IEWrite(form1.IE,'<html><body><b>haha</b></body></html>');
end;

procedure TTestIE.IEWrite(const webbrowser: Twebbrowser
const content: string);
var
vv: Variant;
HTMLDocument: IHTMLDocument2;
begin
vv := VarArrayCreate([0, 0], varVariant);
vv[0] := content;
HTMLDocument := webbrowser.Document as IHTMLDocument2;
HTMLDocument.write(PSafeArray(TVarData(vv).VArray));
HTMLDocument.charset := 'gb2312';
HTMLDocument.close;
vv := Unassigned;
end;
end.
 
在线程里使用COM接口没有初试化COM当然要出错,要先coIni*****
 
uses ActiveX


CoInitialize(nil)
 
已经CoInitialize(nil);了,信息是
access violation at address 70d82649 in module 'mshtml.dll'

而且HTMLDocument.body.innerHTML := 'haha'是可以的,就是直接写就错误.
 
你编译以后,不要在ide下运行,看效果如何?[:D]
 
还是刚才的错误,不知道我哪里出错阿.老大们有没有在线程下用twebbrowser的简单列子?
我对照一下看看我到底哪里出错了
 
线程代码代码如下,大家看看哪里出错了?
unit Unit2;

interface

uses
Classes, Activex, SHDocVw_TLB, mshtml,Variants;

type
TTestIE = class(TThread)
private
{ Private declarations }
procedure IEWrite(const webbrowser: Twebbrowser
const content: string);
protected
procedure Execute
override;
end;

implementation
uses
Unit1;
{ TTestIE }

procedure TTestIE.Execute;
begin
{ Place thread code here }
CoInitialize(nil);
IEWrite(form1.IE,'<html><body><b>haha</b></body></html>');
end;

procedure TTestIE.IEWrite(const webbrowser: Twebbrowser
const content: string);
var
vv: Variant;
HTMLDocument: IHTMLDocument2;
begin
vv := VarArrayCreate([0, 0], varVariant);
vv[0] := content;
HTMLDocument := webbrowser.Document as IHTMLDocument2;
HTMLDocument.write(PSafeArray(TVarData(vv).VArray));
HTMLDocument.charset := 'gb2312';
HTMLDocument.close;
vv := Unassigned;
end;
end.

 
[:D]IEWrite(form1.IE,'<html><body><b>haha</b></body></html>');
加上保护方法!呵呵,不过这样就和在窗口里执行一样了
 
保护方式?
Synchronize?
竟然错误:
Synchronize(IEWrite(form1.IE, '<html><body><b>haha</b></body></html>'));

[Error] Unit2.pas(26): There is no overloaded version of 'Synchronize' that can be called with these arguments
 
去洗个澡先,再不能解决这个问题我就打算放弃了,不过谢谢张大侠大力帮助,我还是学到很多
 
晕啊,你写个过程,过程里就是
IEWrite(form1.IE,'<html><body><b>haha</b></body></html>');
再保护这个过程就OK了
 
真的太谢谢你了,以后有什么难题我我再向你请教,请不要躲着我!
 
楼主,你好,请问这个问题你得到答案吗?
希望你能Post出来。
 
后退
顶部