是否有一些已知的单元在使用时会自动初始化COM库?

时间:2015-07-10 13:17:55

标签: delphi com delphi-2009

我制作了一个需要使用API​​ DoDragDrop函数的自定义控件,他们说我必须在调用此函数之前调用OleInitialize

我在MyControl.Create方法中执行此操作但得到S_FALSE结果,因此这意味着COM库已经初始化。但谁初始化它?

我之前没有在我的应用程序中初始化它。我在想,也许有一些delphi单元在他的initialization部分初始化它......如果我继续用MyControl.Create方法初始化COM库,那么我应该怎么做?我根本没有初始化(因为它已经初始化了)?

1 个答案:

答案 0 :(得分:3)

正如我在answer中提到的类似问题:

  

在RTL / VCL源中,COM通过以下方式初始化:

     
      
  1. 致电Forms.TApplication.Create来自CoInitialize。因此,此调用将针对所有VCL表单应用程序进行,但不是   例如,对于服务应用程序。
  2.   
  3. 致电CoInitializeEx中的ComObj.InitComObjInitProc。这被注册为initialization   ComObj单元的Application.Initialize部分。反过来,打电话给   项目中的ComObj.InitComObj .dpr文件的代码将会调用   S_FALSE
  4.   
  5. 在RTL / VCL周围的许多其他位置。包括但不限于Datasnap,ComServ,Soap,System.Win.Sensors,   Winapi.DirectShow9。其中一些代码区域比最近的代码更新   德尔福7。
  6.         

    现在,在这些各种COM初始化中,计数的是1   2.在任何标准VCL表单应用程序中,这两个都将运行   在主线程启动时。项目1首先运行,因此得到   首先初始化COM。这是重要的初始化。第2项   运行并返回Forms,意味着COM已经存在   初始化。

所有VCL应用程序都包含$('#button').click(function (e) { e.preventDefault(); $('#box').stop(true).effect({ effect: 'bounce', complete: function() { $('#box').removeAttr('style'); } }); }); 单元,因此您可以确保在主VCL线程中初始化COM。对于其他线程,您需要在必要时初始化COM。

您必须永远不要在控件中初始化COM,或者更常见的是您无法控制的线程。如果这样做,那么初始化可能会与线程所有者指定的单元类型冲突。