我目前正在學習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
錯誤0x80010119
(RPC_E_TOO_LATE
,安全必須在任何接口編組或彙編之前初始化,它在初始化後無法更改)
我從VB6程序中運行導出的函數,其中導入的函數是Declare Function vss Lib vshadow.dll ...
。
錯誤是否意味着VB6程序已經調用了CoInitializeSecurity
?我能對付這個錯誤做什麼?
另外,我還有一個問題:爲什麼選擇安全值RPC_C_AUTHN_LEVEL_PKT_PRIVACY
和RPC_C_IMP_LEVEL_IDENTIFY
?其他設置會有什麼影響?
好的,我需要在這裏澄清一下......(1)EXE知道什麼合適的值,DLL不知道?如果編譯爲EXE的項目使用與DLL完全相同的值,爲什麼它們不正確? CoInitializeSecurity參數中甚至沒有唯一的ID。(2)您是否有任何想法可以解決此問題,並從DLL啓動卷影副本? DLL的當前狀態只是中間的;我只是在練習編寫一個通用的VSS DLL。 – 2011-04-14 11:38:25
這很簡單,DLL可能會被多個進程使用。它是*進程*,它決定了它所需要的安全上下文。我強烈建議你忘記這一點,COM安全性在非DCOM方案中很難得到正確和很大程度上的不相關。 – 2011-04-14 11:53:10
@Hans:那麼,我的老闆告訴我「寫一個可以創建卷影副本的DLL」......我聽說過可以做到這一點的DLL,必須有辦法! – 2011-04-14 12:20:16