我通过使用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实例很重要?
答案 0 :(得分:6)
你不应该在DLL中这样做。使其成为DLL和主机负责初始化COM的主机之间的合同的一部分。
不能期望DLL初始化COM,因为主机可能已经这样做了。并使用不同的线程模型。初始化COM后,如果尝试更改线程模式,将来尝试初始化将失败。
因此,不要在DLL中初始化COM。要求主持人这样做。