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实例。-但是很痛。您应该只对自己的线程进行
协同初始化。