我目前正在学习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