constructor TListRecorder.Create;
begin
CoInitialize(nil); //后来去掉了,也没关系的样子
CDBWork1 := TCDBWork.Create(nil); //com对象 query := TAdoQuery.Create(nil); //com对象
inherited Create(True);
end;procedure TListRecorder.Execute;
var
s: _Stream;
buf: Variant;
rs: _Recordset;
Param: TQueryRecordParam;
begin
.....
....
CoInitialize(nil); //后来加的,加了就没问题了
CDBwork1.RemoteMachineName := frmMain.RecorderServerIP;
CDBwork1.Connect;
if CDBWork1.pConnected then
....
....
end;
本来只有在create 里才有CoInitialize,但还是报错,我就在Execute又加了一个;可以了
是不是创建时,我把create 里的去掉了,也没问题,我想问一下CoInitialize是什么意思,
怎么用,什么时候用。
begin
CoInitialize(nil); //后来去掉了,也没关系的样子
CDBWork1 := TCDBWork.Create(nil); //com对象 query := TAdoQuery.Create(nil); //com对象
inherited Create(True);
end;procedure TListRecorder.Execute;
var
s: _Stream;
buf: Variant;
rs: _Recordset;
Param: TQueryRecordParam;
begin
.....
....
CoInitialize(nil); //后来加的,加了就没问题了
CDBwork1.RemoteMachineName := frmMain.RecorderServerIP;
CDBwork1.Connect;
if CDBWork1.pConnected then
....
....
end;
本来只有在create 里才有CoInitialize,但还是报错,我就在Execute又加了一个;可以了
是不是创建时,我把create 里的去掉了,也没问题,我想问一下CoInitialize是什么意思,
怎么用,什么时候用。
我用 CoInitializeEx(nil,COINIT_MULTITHREADED);在子线程初始化//frmMain.主窗体,CDBWork1,主窗体中com对象
procedure TListRecorder.Execute;
var
s: _Stream;
buf: Variant;
rs: _Recordset;
Param: TQueryRecordParam;
begin
.....
....
CoInitializeEx(nil,COINIT_MULTITHREADED);//初试化
frmMain.CDBwork1.RemoteMachineName := frmMain.RecorderServerIP;
frmMain.CDBwork1.Connect;
if frmMain.CDBWork1.pConnected then
....
....
end;使现成能调用主线程里的com对像,报错:
the application called an interface that
was marshalled for different thread
COM定义了两种类型的套间,STA(单线程套间)和MTA(多线程套间)。STA的特点是套间内永远只有一个线程运行,并且一定是创建该套间的初始线程。因而开发只运行在STA中的组件不需要考虑线程同步等问题。MTA的特点是套间内可以有多个线程运行,并且还可以创建新的线程。在MTA中运行的组件必须自己实现线程的同步。套间的进入和退出:
线程通过CoInitializeEx函数进入套间,该函数的第二个参数通过传递COINIT_APARTMENTTHREADED和COINIT_MULTITHREADED标志了套间类型。如果传递COINIT_APARTMENTTHREADED,该线程将创建自己私有的套间STA,别人不能进入。如果传递COINIT_MULTITHREADED,该线程将进入当前进程范围内的MTA。线程调用CoUninitialize函数用于退出所在的套间。只有退出后才可以进入其它类型的套间。
------------------------------------------------------------------------------
楼主,DELPHI的APPLICATION缺省的主线程已经调用过CoInitialize,进入了一个STA,
而你的工作线程是进入MTA,我想这是你程序报错原因...
你在主线程创建COM对象时,可先退出STA,然后再进入MTA创建COM...这样在工作线程的MTA就可以访问到这个COM了.强烈建议不这样做!不要随便用MTA...1,COM组件本身的实现往往是STA的..客户与服务的线程模式匹配才能有较高效率.
2,MTA 把线程安全性的责任交给了你..要特别小心...