【问题标题】:How to tell if CoInitializeSecurity has already been called for a process?如何判断 CoInitializeSecurity 是否已经为进程调用?
【发布时间】:2011-07-27 06:27:33
【问题描述】:

有没有简单的方法来判断 CoInitializeSecurity 是否已经被调用?

我需要调用 CoInitializeEx 并使用 COM 接口,但有时调用代码(我无法控制)首先调用我,然后在它的启动序列中到达 CoInitializeSecurity,然后它倒下与 E_RPC_TOO_LATE。

我想要做的是检测到 CoInitializeSecurity 尚未被调用,并延迟一小段时间(大约十秒左右),直到调用者成功到达 CoInitializeSecurity,然后我继续到 CoInitializeEx。

添加此延迟可以很好地解决问题,除了,我不喜欢在每次调用时都有这种延迟 - 只是启动期间的第一个。因此,希望检测 CoInitializeSecurity 是否已被调用。

【问题讨论】:

  • 嗯,调用时获取 E_RPC_TOO_LATE 来检测它已经被调用。那可帮不上忙。如果您无法控制其他代码的功能,则很难找到治愈方法。与该代码的所有者交谈以解决问题。
  • 我看到没有人回答你的问题;我需要一个答案。我想也许会问,“如何获取我当前的 COM 线程模型?” 可能会解决问题(如果我们可以获得一个线程模型,那么我们就知道它已经被初始化了) .但我也找不到这个问题的答案。

标签: com


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我对这个问题的上下文有点困惑。你能澄清一下吗?

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

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

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

    (注意:我至少有一周没有可靠的死树参考资料了;我可能无法立即提供帮助)。

    【讨论】:

    • 你是对的:我的代码运行在一个由 EXE 加载的 DLL 中,我不控制 EXE。正如我所写,我需要调用 CoInitializeEx,以便创建一个 COM 接口并对其进行一些调用。我不想调用 CoInitializeSecurity,但如果没有其他人调用它,COM 会“为我”做这件事。我只需要先让应用程序调用,否则应用程序本身在 E_RPC_TOO_LATE 上失败,我无法控制。
    • 我确实调用 CoSetProxyBlanket 来设置我想要在我的界面上的安全性——这不是问题。问题是 EXE 初始化事物的顺序,我必须解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多