为什么我的 DLL 中的 COM CoInitializeSecurity 失败?

问题描述 投票:0回答:1

我目前正在研究 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
?其他设置会产生什么影响?

windows dll com
1个回答
13
投票

有几个标准 COM 调用属于 DLL。就像

CoInitializeEx()
一样,为线程初始化 COM 的调用。 DLL 不拥有线程,它无法覆盖 EXE 选择的单元状态。

CoInitializeSecurity()
是另一个,调用它是EXE的工作。只有它知道要传递的正确值,才能确定安全策略。 DLL 不能,它不知道有关客户端进程的任何信息。

© www.soinside.com 2019 - 2024. All rights reserved.