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

Jer*_*dge 1 delphi com dll ado

我正在使用属性并实现包含共享ADO连接的DLL,并将其跨越DLL边界传递到其他实例.我需要确保COM已初始化,所以我需要调用/ .目前它位于VCL主线程的上下文中,但可能位于另一个线程的其他位置,当然需要其自己的COM实例.我目前没有实现多线程.ConnectionObjectTADOConnectionTADOConnectionCoInitializeCoUninitialize

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

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

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

Dav*_*nan 6

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

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

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