初始化COM安全性失败

Initializing COM Security Failed

本文关键字:失败 安全性 COM 初始化      更新时间:2023-10-16

我试图从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内部运行它,这实际上是Main.exe的函数扩展程序(我没有访问源或任何)。

我用这整段代码通过IWbemClassObject&IEnumWbemClassObject,所以我想知道有什么更容易/更简单的方法来解决它,或者检索硬件数据(比如BIOSVersion Win32_BIOS SerialNumber Win32_VideoController Name

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

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

这意味着你需要在dll中初始化COM,但这并不像看上去那么简单,因为你不能控制应用程序线程——除非你能确保控制执行COM调用的线程,否则应该避免在dll中启动COM。

一个可能的解决方案是为COM调用创建一个工作线程,在该线程中可以根据需要初始化COM。