2011-04-14 80 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