我目前正在从MS Windows SDK 6.1学习VSHADOW.EXE 3.0。 我已经做了一个版本,可以被编译成一个DLL,只输出一个新的函数,该函数需要命令行作为一个string,标记它,然后调用旧的wmain
。 该DLL不是一个COM服务器。
它编译为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
? 我能做什么反对错误?
另外,我还有一个问题:为什么select安全值RPC_C_AUTHN_LEVEL_PKT_PRIVACY
和RPC_C_IMP_LEVEL_IDENTIFY
? 其他设置会有什么影响?
有几个标准的COM调用不属于DLL。 像CoInitializeEx()一样,为线程初始化COM的调用。 该DLL不拥有该线程,它是无力覆盖EXE选择的公寓状态。
CoInitializeSecurity()是另一个,EXE调用它的工作。 只有知道合适的值才能通过,这是决定安全策略的一个因素。 DLL不能,它不知道有关客户端进程的任何信息。