NET客户端卸载使用IGlobalInterfaceTable的COM DLL [英] Unload COM DLL used IGlobalInterfaceTable by .NET client

查看:88
本文介绍了NET客户端卸载使用IGlobalInterfaceTable的COM DLL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我有一个简单的STA COM DLL和一个简单的.NET客户端(客户端应来自其他提供程序). COM对象将由IGlobalInterfaceTable存储.如果.NET客户端退出,则不会调用DllCanUnloadNow()或CoUninitialize(),因此我没有任何可能性 清理IGlobalInterfaceTable并销毁COM对象.在DllMain上指向DLL_PROCESS_DETACH的点太晚了,无法销毁COM对象.

I have a simple STA COM DLL and simple .NET client (client should be from another provider). COM object will be store by IGlobalInterfaceTable. If .NET client exits, it calls neither DllCanUnloadNow() nor CoUninitialize(), so I do not have any possibility to clean up IGlobalInterfaceTable and destroy COM object. Point for DLL_PROCESS_DETACH on DllMain is too late for destroying COM objects.

如何以正确的方式关闭COM DLL?

How can I shutdown COM DLL for right way?

使用ATL客户端进行跟踪:

Tracing with ATL client:

启动ATL客户端.
DLL_PROCESS_ATTACH
DllGetClassObject
CInterfTest :: CInterfTest
CInterfTest ::: AddCInterfTestToIGlobalInterfaceTable
DLL_THREAD_ATTACH
在forUnCoinitialize之前.
CInterfTest :: FinalRelease
DLL_THREAD_ATTACH
CInterfTest ::〜CInterfTest
DllCanUnloadNow _AtlModule.GetLockCount = 0
清理IGlobalInterfaceTable
DLL_PROCESS_DETACH
清理IGlobalInterfaceTable
按任何一个键退出.
结束ATL客户端.

Start ATL client.
DLL_PROCESS_ATTACH
DllGetClassObject
CInterfTest::CInterfTest
CInterfTest::AddCInterfTestToIGlobalInterfaceTable
DLL_THREAD_ATTACH
befor CoUninitialize.
CInterfTest::FinalRelease
DLL_THREAD_ATTACH
CInterfTest::~CInterfTest
DllCanUnloadNow _AtlModule.GetLockCount = 0
clean IGlobalInterfaceTable
DLL_PROCESS_DETACH
clean IGlobalInterfaceTable
Press any key to exit.
End ATL client.

使用.NET客户端进行跟踪:

Tracing with .NET client:

启动.NET客户端(Activator.CreateInstance).
befor CoUninitialize.
按任意键退出.
 结束.NET客户端.
DLL_PROCESS_ATTACH
DllGetClassObject
CInterfTest :: CInterfTest
DLL_THREAD_ATTACH
CInterfTest ::: AddCInterfTestToIGlobalInterfaceTable
DLL_PROCESS_DETACH
清理IGlobalInterfaceTable
RevokeInterfaceFromGlobal hr = 0x80010007

Start .NET client (Activator.CreateInstance).
befor CoUninitialize.
Press any key to exit.
 End .NET client.
DLL_PROCESS_ATTACH
DllGetClassObject
CInterfTest::CInterfTest
DLL_THREAD_ATTACH
CInterfTest::AddCInterfTestToIGlobalInterfaceTable
DLL_PROCESS_DETACH
clean IGlobalInterfaceTable
RevokeInterfaceFromGlobal hr = 0x80010007

感谢您的帮助!

推荐答案

Hi

我们正在对此问题进行研究.可能需要一些时间才能反馈给您.

We are doing research on this issue. It may take some time to feed back to you.

感谢您的理解.


这篇关于NET客户端卸载使用IGlobalInterfaceTable的COM DLL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆