在DLL中调用CoInitialize / CoUninitialize的合适位置是什么?

时间:2015-05-03 23:19:58

标签: delphi dll com ado

我通过使用ConnectionObject的{​​{1}}属性实现包含a shared ADO Connection的DLL,并将其跨越DLL边界传递到TADOConnection的其他实例。我需要确保COM已初始化,因此我需要致电TADOConnection / CoInitialize。目前它位于VCL主线程的上下文中,但可能位于另一个线程的其他位置,当然requires its own instance of COM。我目前没有实现多线程。

适合这些地方的地方在哪里; DLL内部(在加载/卸载期间),DLL外(调用进程),还是两者兼而有之?考虑到它只有一个线程,在原始进程中它不应该只在DLL之外一次吗?

我假设原始调用线程应该对此负责,因为COM在线程的上下文中运行。当然,双方都打电话给他们不应该受到任何伤害,但是它也会创建多个COM实例。

长话短说......安全是否安全"在这种情况下?或者只保留一个COM实例很重要?

1 个答案:

答案 0 :(得分:6)

你不应该在DLL中这样做。使其成为DLL和主机负责初始化COM的主机之间的合同的一部分。

不能期望DLL初始化COM,因为主机可能已经这样做了。并使用不同的线程模型。初始化COM后,如果尝试更改线程模式,将来尝试初始化将失败。

因此,不要在DLL中初始化COM。要求主持人这样做。