初始化 COM 安全性失败

Initializing COM Security Failed

我正在尝试从 DLL 初始化 COM 安全性,但出现错误 800401f0。我主要使用标准方法,

代码:


 HRESULT hres;

    hres = CoInitializeEx(0, COINIT_MULTITHREADED);

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------

    hres = CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

如果我 运行 它来自我的 app.exe,它工作得很好,但问题是我 运行 将它放在 .DLL 中,它实际上是 [= 的功能扩展器28=](我没有访问权限 - 来源或任何)。

我用这整个代码来获取机器数据,比如 - BIOS 版本,通过 IWbemClassObjectIEnumWbemClassObject,所以我想知道 easier/simpler 解决它的方法是什么,或检索硬件数据(如 BIOSVersion Win32_BIOS SerialNumber Win32_VideoController Name?

错误 800401f0 表示尚未为当前线程调用 CoInitialize,但您的代码片段使其看起来像这样。

我想代码片段中显示的代码要么来自您自己的 app.exe,要么来自 dll,那么这两个调用不是在同一线程上进行的。

这意味着您需要在 dll 中初始化 COM,但这并不像看起来那么简单,因为您不控制应用程序线程 - 应避免在 dll 中初始化 COM,除非您可以确保您控制执行 COM 调用的线程。

一个可能的解决方案是create a worker thread for COM calls where you can initialize COM according to your requirements