什么是适当的地方调用CoInitialize / CoUninitialize跨越DLL的?(Wha

2019-10-22 22:47发布

我实施含有DLL 共享ADO连接通过使用ConnectionObject的属性TADOConnection并使其跨DLL边界到的其他实例TADOConnection 。 我需要确保COM被初始化,所以我需要调用CoInitialize / CoUninitialize 。 目前,它在一个VCL主线程的上下文,但可以在另一个线程,当然这是在其他地方都需要自己的COM的实例 。 我目前没有实现多线程。

哪里是合适的地方来调用这些; 所述DLL(装载/卸载期间),DLL(呼叫处理)的外部,或二者内? 考虑到这只是一个线程,它不应该在原有过程中的DLL外只有一次?

我假设原来的调用线程应该为此承担全部责任,因为COM在一个线程的上下文中运行。 当然,他们呼吁双方应该不会伤害任何,但它也将创建多个COM实例。

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

Answer 1:

你不应该在DLL中这样做。 让它的DLL和主机负责初始化COM主机之间的合同的一部分。

该DLL不能指望因为主机可能已经这样做初始化COM。 并使用不同的线程模型。 一旦COM已被初始化,然后以后尝试初始化会失败,如果他们试图更改线程模式。

所以,不要在你的DLL初始化COM。 需要主机这样做。



文章来源: What's the appropriate place to call CoInitialize/CoUninitialize across DLL's?
标签: delphi dll com ado