2011-04-14 49 views
7

我目前正在學習MS Windows SDK 6.1中的VSHADOW.EXE 3.0。我編寫了一個可以編譯成DLL的版本,該DLL只導出一個新編寫的函數,該函數將命令行視爲一個字符串,對其進行標記,然後調用舊的wmain。該DLL不是一個COM服務器。爲什麼COM CoInitializeSecurity在我的DLL中失敗?

它的工作原理完全按照舊當作爲EXE編譯但不作爲時,一個DLL,因爲這個調用失敗編譯相當的工作:

CoInitializeSecurity(NULL, -1, NULL, NULL, 
         RPC_C_AUTHN_LEVEL_PKT_PRIVACY, 
         RPC_C_IMP_LEVEL_IDENTIFY, 
         NULL, EOAC_NONE, NULL); 

其失敗HRESULT錯誤0x80010119RPC_E_TOO_LATE安全必須在任何接口編組或彙編之前初始化,它在初始化後無法更改

我從VB6程序中運行導出的函數,其中導入的函數是Declare Function vss Lib vshadow.dll ...

錯誤是否意味着VB6程序已經調用了CoInitializeSecurity?我能對付這個錯誤做什麼?

另外,我還有一個問題:爲什麼選擇安全值RPC_C_AUTHN_LEVEL_PKT_PRIVACYRPC_C_IMP_LEVEL_IDENTIFY?其他設置會有什麼影響?

回答

11

有幾個標準的COM調用而不是屬於一個DLL。像CoInitializeEx(),這是爲一個線程初始化COM的調用。該DLL不擁有該線程,它無力覆蓋EXE選擇的公寓狀態。

CoInitializeSecurity()是另一個,它是EXE調用它的工作。只有它知道合適的值才能通過,這是決定安全策略的一個因素。 DLL不能,它不知道有關客戶端進程的任何信息。

+0

好的,我需要在這裏澄清一下......(1)EXE知道什麼合適的值,DLL不知道?如果編譯爲EXE的項目使用與DLL完全相同的值,爲什麼它們不正確? CoInitializeSecurity參數中甚至沒有唯一的ID。(2)您是否有任何想法可以解決此問題,並從DLL啓動卷影副本? DLL的當前狀態只是中間的;我只是在練習編寫一個通用的VSS DLL。 – 2011-04-14 11:38:25

+0

這很簡單,DLL可能會被多個進程使用。它是*進程*,它決定了它所需要的安全上下文。我強烈建議你忘記這一點,COM安全性在非DCOM方案中很難得到正確和很大程度上的不相關。 – 2011-04-14 11:53:10

+0

@Hans:那麼,我的老闆告訴我「寫一個可以創建卷影副本的DLL」......我聽說過可以做到這一點的DLL,必須有辦法! – 2011-04-14 12:20:16