我目前正在研究 MS Windows SDK 6.1 中的 VSHADOW.EXE 3.0。我制作了一个可以编译成 DLL 的版本,该版本仅导出一个新编写的函数,该函数期望命令行作为字符串,对其进行标记,然后调用旧的
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
?我该如何应对该错误?
另外,我还有一个问题:为什么选择安全值
RPC_C_AUTHN_LEVEL_PKT_PRIVACY
和RPC_C_IMP_LEVEL_IDENTIFY
?其他设置会产生什么影响?
有几个标准 COM 调用不属于 DLL。就像
CoInitializeEx()
一样,为线程初始化 COM 的调用。 DLL 不拥有线程,它无法覆盖 EXE 选择的单元状态。
CoInitializeSecurity()
是另一个,调用它是EXE的工作。只有它知道要传递的正确值,才能确定安全策略。 DLL 不能,它不知道有关客户端进程的任何信息。