【发布时间】:2015-07-13 06:28:42
【问题描述】:
我正在实现一个包含a shared ADO Connection 的DLL,方法是使用TADOConnection 的ConnectionObject 属性并将其跨DLL 边界传递到TADOConnection 的其他实例。我需要确保 COM 已初始化,因此我需要调用 CoInitialize / CoUninitialize。目前它在 VCL 主线程的上下文中,但可能在另一个线程的其他地方,当然是requires its own instance of COM。我目前没有实现多线程。
在哪里合适地调用这些;在 DLL 内部(加载/卸载期间),在 DLL 外部(调用进程),还是两者兼而有之?考虑到只有一个线程,在原进程中不应该只在DLL外一次吗?
我假设最初的调用线程应该对此单独负责,因为 COM 在线程的上下文中运行。当然在双方都调用它们应该不会有任何伤害,但是它也会创建多个 COM 实例。
长话短说......在这种情况下“安全是安全的”吗?还是只保留一个 COM 实例很重要?
【问题讨论】:
-
我基本上是在打字的时候回答了我自己的问题,我只需要确认我理解的内容。
-
当然,在双方都调用它们不应该有任何伤害,但是它也会创建多个 COM 实例。 - 但它会伤害。你应该只
CoInitialize一个你拥有的线程。