我也好象觉得TThread里好象建不了COM对象,
这几天正在死K COM线程模型,但愿能弄清楚明白是怎么回事。

解决方案 »

  1.   

    哦。。这在儿用一个标志就行了.
    begin
      CoInitFlags := 0;  //缺省是-1, 不使用线程模型
      Application.Initialize;
    .....
    ....
      Application.Run;
    end.
      

  2.   

    不会啊,THREAD很好用的,但要建立COM对象要不同处理,就是要先CoInitialize一下,用完后CoUninitialize一下即可
      

  3.   

    我昨天刚为了这个问题挑了一天的bug便宜你了,呵呵:)使用CoInitilize不用多说了,使用前先uses ActiveX;再CoInitilize(nil);在多线程中不要同时在超过3个线程中同时进行com对象的操作,最好在线程中对每3个com对象的操作进行同步控制。另外CoInitilize(nil)不用在每个线程中都调用来进行初始化,只要在主线程中执行一次就行了。delphi中com在多线程中的确会有很多莫明其妙的现象,这并不是delphi的bug,这只是我们还不太了解com的底层开发技术所至。
      

  4.   

    to halfdream(哈欠) 线程中完全可以使用如ADO等的com对象,建议多看些com底层的东西。否则做这些活会很迷糊的。
      

  5.   

    喂喂。。to Crob(我干嘛这么帅) 
    你自己干嘛不看看源码,
    设置那个标志其实同你CoInitlize(nil) 或CoInitlizeEx(..)
    差不多本意是一致的!
      

  6.   

    关于Thread中COM的问题, 那是好些天前发的, 确实有点不好意思。但我现在相信已经很清楚了。
      

  7.   

    经过研究,我建议使用CoInitlizeEx(nil, COINIT_MULTITHREADED);来初始化线程中的com,因哦MSDN中说:CoInitializeEx
    This function initializes the Component Object Model (COM) for use by the current thread. Applications are required to use CoInitializeEx before they make any other COM library calls except for memory allocation functions. 
      

  8.   

    to Crob,
    我也建议试着用一下CoInitLizeEx(nil,COINIT_APARTMENTTHREAD);来初始化。
    这样可以提高线程安全性。