ATL炒冷饭学习之三:CoInitialize/CoUninitialize

一、CoInitialize

        CoInitialize是Windows提供的API函数,用来告诉 Windows以单线程的方式创建com对象。应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。

HRESULT CoInitialize(

        _In_opt_ LPVOID pvReserved

);

参数被保留,且必须为NULL。


S_OK : 该线程中COM库初始化成功

S_FALSE: 该线程中COM库已经被初始化 CoInitialize () 标明以单线程方式创建。

使用 CoInitialize 创建可以使对象直接与线程连接,得到最高的性能。

        CoInitialize并不装载COM 库,它只用来初始化当前线程使用什么样的套件。使用这个函数后,线程就和一个套件建立了对应关系。线程的套件模式决定了该线程如何调用COM对象,是否需要列集等。

        CoInitialize ()并不会干扰客户和服务器之间的通信,它所做的事情是让线程注册一个套件,而线程运行过程中必然在此套件。

        CoInitialize和CoUninitialize必须成对使用。

        创建新的应用程序就调用CoInitializeEx代替CoInitialize。

二、CoUninitialize

        CoUninitialize关闭当前线程的COM库,卸载线程加载的所有dll,释放任何其他的资源,关闭在线程上维护所有的RPC连接。
        void CoUninitialize();
备注:
        一个线程必须调用 CoUninitialize 一次在每次成功调用CoInitialize或CoInitializeEx。只有CoUninitialize对应于CoInitialize调用对应CoInitialize或CoInitializeEx调用他们初始化库能关闭它。
调用OleInitialize必须通过调用OleUninitialize平衡。OleUninitialize 函数调用的OleUninitialize内部,所以应用程序调用OleUninitialize不也需要调用CoUninitialize。
        CoUninitialize应该在应用程序关闭后调用,作为最后一次调用COM库在应用程序主窗户隐藏,消息循环结束之后。如果有剩余的对话开着,CoUninitialize开始了模态消息循环和派发任何挂起的消息在容器或服务器里对于这个COM应用程序。通过派发信息,CoUninitialize 在确保应用程序等待所有它的消息接收之前不退出。Non-COM信息被丢弃。
        因为没有办法控制顺序进程内服务器加载或卸载, 从DllMain函数中调用CoInitialize, CoInitializeEx,或者 CoUninitialize 是不安全的。

你可能感兴趣的:(C/C++,ATL,OCX,C/C++,ATL,OCX,服务进程,内核编程)