如何判断是否已为进程调用CoInitializeSecurity?

时间:2011-03-31 21:31:09

标签: com

是否有一种简单的方法可以判断是否已经为某个流程调用了CoInitializeSecurity?

我需要调用CoInitializeEx并使用COM接口,但有时调用代码(我无法控制)在它启动序列到达CoInitializeSecurity之前先调用我,然后它就会崩溃与E_RPC_TOO_LATE。

我想要做的是检测到尚未调用CoInitializeSecurity,并延迟一段时间(大约十秒左右),直到调用者设法将其设置为CoInitializeSecurity,然后才继续参加CoInitializeEx。

添加此延迟可以很好地解决问题,但是,我不希望每次调用都有延迟 - 只是启动时的第一个。因此,希望检测是否已经调用了CoInitializeSecurity。

2 个答案:

答案 0 :(得分:0)

我找到了解决办法,直到找到更好的东西:

在调用CoInitializeEx之前,我调用GetProcessTimes(GetCurrentProcess(),...),以便查看自创建进程以来已经过了多长时间。如果它还没有“足够长”,我会睡一会儿。这让我的调用者有机会在开始点击COM之前到达CoInitializeSecurity。

答案 1 :(得分:0)

我对这个问题的背景有点困惑。你能说清楚吗?

根据您的描述,听起来您的代码在由您无法控制的EXE加载的DLL中运行。 EXE将完全控制其寿命,并且不会受到这些问题的影响。此外,您似乎可以互换地谈论CoInitialize和CoInitializeSecurity。你真的是说你“需要调用CoInitializeEx()”,或“需要调用CoInitializeSecurity()”吗?

您真的需要设置流程范围的权限吗? (这不是DLL应该做的事情;它应该在EXE级别完成)。也许像CoSetProxyBlanket()这样的东西更接近你需要的东西。

更多上下文可能有助于澄清问题。

(注意:至少一周我没有我可信赖的死树参考资料;我可能无法马上帮忙)。