Delphi 什么';s调用跨DLL的CoInitialize/ConInitialize的适当位置';s

Delphi 什么';s调用跨DLL的CoInitialize/ConInitialize的适当位置';s,delphi,dll,com,ado,Delphi,Dll,Com,Ado,我正在使用TADOConnection的ConnectionObject属性实现一个包含的DLL,并将其跨DLL边界传递到TADOConnection的其他实例中。我需要确保COM已初始化,因此我需要调用CoInitialize/CoUninitialize。目前,它位于VCL主线程的上下文中,但也可能位于另一个线程的其他位置,这当然是正确的。我目前没有实现多线程 在什么地方可以称之为这些;在DLL内部(加载/卸载期间),在DLL外部(调用进程),还是两者兼而有之?考虑到它只有一个线程,在原始进

我正在使用
TADOConnection
ConnectionObject
属性实现一个包含的DLL,并将其跨DLL边界传递到
TADOConnection
的其他实例中。我需要确保COM已初始化,因此我需要调用
CoInitialize
/
CoUninitialize
。目前,它位于VCL主线程的上下文中,但也可能位于另一个线程的其他位置,这当然是正确的。我目前没有实现多线程

在什么地方可以称之为这些;在DLL内部(加载/卸载期间),在DLL外部(调用进程),还是两者兼而有之?考虑到它只有一个线程,在原始进程中,它不应该只有一次超出DLL吗

我假设最初的调用线程应该对此负责,因为COM是在线程的上下文中运行的。当然,在双方调用它们都不会造成任何伤害,但是它也会创建多个COM实例


长话短说。。。在这种情况下“安全是安全的”吗?或者只保留一个COM实例很重要吗?

您不应该在DLL中执行此操作。使其成为DLL和主机之间的契约的一部分,主机负责初始化COM

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


所以,不要在DLL中初始化COM。要求主机执行此操作

是的,我忘记了不同的线程模型-这肯定会在共享连接的两个实现中造成问题。这不是关于DLL代码,而是关于线程所有权。如果启动线程,您可能(也可能应该)初始化COM。如果没有,您最多可以要求调用者以特定的方式初始化COM(例如单线程、多线程、OLE)。我基本上在键入时回答了我自己的问题,我只需要确认我理解的内容。当然,两边都调用它们不会有任何伤害,但是,它也会创建多个COM实例。-但是很痛。您应该只对自己的线程进行
协同初始化。