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

3
有没有一种简单的方法来判断进程是否已经调用了CoInitializeSecurity?
我需要调用CoInitializeEx并使用COM接口,但有时调用代码(我无法控制)会在启动序列期间首先调用我,然后才调用CoInitializeSecurity,这时就会出现E_RPC_TOO_LATE错误。
我的想法是检测CoInitializeSecurity是否已经被调用,如果没有,就延迟一段很小的时间(大约十秒左右),直到调用者成功地调用了CoInitializeSecurity,然后再继续调用CoInitializeEx。
添加这个延迟可以很好地解决问题,但我不希望每次都有这个延迟 - 只是在启动期间的第一个调用中。因此,我想要检测CoInitializeSecurity是否已经被调用过。

嗯,当你调用它时,你会得到E_RPC_TOO_LATE的提示,这意味着它已经被调用了。这并没有什么帮助。如果你无法控制其他代码的行为,很难找到解决方法。与该代码的所有者交谈,以达成共识。 - Hans Passant
我看到还没有人回答你的问题,这是我也需要答案的问题。我想也许问一下,“如何获取当前的 COM 线程模型?”可能会起到作用(如果我们可以“获取”线程模型,则知道它已被初始化)。但我也找不到那个问题的答案。 - Ian Boyd
2个回答

0

我已经想出了一个解决方法,直到我找到更好的方法:

在调用CoInitializeEx之前,我调用GetProcessTimes(GetCurrentProcess(), ...)来查看进程创建以来的时间有多长。如果还没有“足够长的时间”,我会稍微休眠一下。这样给我的调用者一个公平的机会,在我开始使用COM之前先调用CoInitializeSecurity。


0

我对问题的上下文有些困惑,请你澄清一下吗?

根据你的描述,似乎你的代码在由你无法完全控制的EXE加载的DLL中运行。 EXE将完全控制其生命周期,并且不会受到这些问题的影响。此外,你似乎将CoInitialize和CoInitializeSecurity混为一谈。 你真正意思是“需要调用CoInitializeEx()”,还是“需要调用CoInitializeSecurity()”?

你真的需要设置进程范围的权限吗? (这不是DLL应该做的事情;它应该在EXE级别完成)。 也许类似于CoSetProxyBlanket()的东西更接近你所需的内容。

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

(注意:我没有我的可靠纸质参考材料至少一个星期; 我可能无法立即提供帮助。)


1
你说得对:我的代码运行在一个被EXE加载的DLL中,而我无法控制这个EXE。我需要调用CoInitializeEx来创建COM接口并进行一些调用,就像我写的那样。我不想调用CoInitializeSecurity,但是如果没有其他人调用它,COM会为我执行此操作。我只需要让应用程序先调用它,否则,应用程序本身会因为E_RPC_TOO_LATE而失败,而我无法控制这个问题。 - Jim Flood
我确实调用了CoSetProxyBlanket来设置我想要的接口安全性——这不是问题。问题在于EXE初始化事物的顺序,我必须解决这个问题。 - Jim Flood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接