2011-03-31 234 views
2

是否有一種簡單的方法來判斷CoInitializeSecurity是否已被調用進程?如何判斷CoInitializeSecurity是否已被調用進程?

我需要調用CoInitializeEx並使用COM接口,但有時調用代碼(我無法控制)在啓動序列期間先調用CoInitializeSecurity,然後它會落入CoInitializeSecurity中結束於E_RPC_TOO_LATE。

我想要做的是檢測CoInitializeSecurity尚未被調用,並延遲一段時間(大約十秒左右),直到調用者設法使其到達CoInitializeSecurity之前,我繼續到CoInitializeEx。

增加這個延遲解決了這個問題很好,除了我不喜歡在每次通話中都有這樣的延遲 - 只是啓動時的第一個延遲。因此,需要檢測CoInitializeSecurity是否已被調用。

+0

嗯,當你調用它時,你會發現它已經被調用了E_RPC_TOO_LATE。這不會有幫助。如果你無法控制其他代碼的功能,很難看到治癒方法。與該代碼的所有者交談以解決問題。 – 2011-03-31 21:41:05

+0

我看到沒有人回答你的問題;我需要一個答案。我想也許會問,「如何得到我當前的COM線程模型?」可能會做到這一點(如果我們可以*得到一個線程模型,那麼我們知道它已經被初始化)。但是我也找不到這個問題的答案。 – 2012-05-31 14:38:22

回答

0

我想出了一個變通辦法,直到我找到更好的東西:

調用的CoInitializeEx之前,我打電話GetProcessTimes(GetCurrentProcess(),...),所以看看它是多久以前的過程中一直創建。如果它沒有「足夠長」,我會睡一會兒。這讓我的調用者有機會在開始訪問COM之前獲得CoInitializeSecurity。

0

我對這個問題的背景有點困惑。你能澄清嗎?

根據您的描述,這聽起來像您的代碼運行在您不完全控制的EXE加載的DLL中。 EXE將完全控制其使用期限,並且不會受到這些問題的困擾。此外,您似乎可以互換地談論CoInitialize和CoInitializeSecurity。你真的認爲你「需要調用CoInitializeEx()」,或者「需要調用CoInitializeSecurity()」嗎?

您是否確實需要設置流程範圍的權限? (這不是DLL應該做的事;它應該在EXE級別完成)。也許像CoSetProxyBlanket()更接近你需要的東西。

多一點上下文可能有助於澄清問題。 (注意:我沒有可信賴的死樹參考資料至少一週;我可能無法立即提供幫助)。

+0

你是對的:我的代碼運行在一個由EXE加載的DLL中,我不控制EXE。正如我寫的,我需要調用CoInitializeEx來創建一個COM接口並對其進行一些調用。我不想調用CoInitializeSecurity,但如果沒有其他人調用它,COM將會「爲我」執行此操作。我只需要先讓應用程序調用,否則應用程序本身會在E_RPC_TOO_LATE上失敗,我無法控制它。 – 2011-04-09 02:58:32

+0

我確實調用CoSetProxyBlanket來設置我想要在我的界面上的安全性 - 這不是問題。問題在於EXE初始化事物的順序,我必須解決這個問題。 – 2011-04-09 03:07:12

相關問題