我制作了一个需要使用API DoDragDrop
函数的自定义控件,他们说我必须在调用此函数之前调用OleInitialize
。
我在MyControl.Create
方法中执行此操作但得到S_FALSE
结果,因此这意味着COM库已经初始化。但谁初始化它?
我之前没有在我的应用程序中初始化它。我在想,也许有一些delphi单元在他的initialization
部分初始化它......如果我继续用MyControl.Create
方法初始化COM库,那么我应该怎么做?我根本没有初始化(因为它已经初始化了)?
答案 0 :(得分:3)
正如我在answer中提到的类似问题:
在RTL / VCL源中,COM通过以下方式初始化:
- 致电
Forms.TApplication.Create
来自CoInitialize
。因此,此调用将针对所有VCL表单应用程序进行,但不是 例如,对于服务应用程序。- 致电
CoInitializeEx
中的ComObj.InitComObj
或InitProc
。这被注册为initialization
ComObj
单元的Application.Initialize
部分。反过来,打电话给 项目中的ComObj.InitComObj
.dpr文件的代码将会调用S_FALSE
。- 在RTL / VCL周围的许多其他位置。包括但不限于Datasnap,ComServ,Soap,System.Win.Sensors, Winapi.DirectShow9。其中一些代码区域比最近的代码更新 德尔福7。
醇>现在,在这些各种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,或者更常见的是您无法控制的线程。如果这样做,那么初始化可能会与线程所有者指定的单元类型冲突。