C++ CoCreateInstance 方法返回 "No Such Interface supported"

标签 c++ dll com group-policy

当我调用 dll 中的 CoCreateInstance() 时,出现错误“不支持此类接口(interface)”。我正在尝试创建 IGroupPolicyObject 的实例。当我通过 exe 运行此示例代码片段时,它返回 S_OK,但如果我通过 DLL 运行,则会出现错误。 我已经添加了示例代码片段。

HRESULT hr =S_OK;
IGroupPolicyObject* pLGPO = NULL;

// MSVC is finicky about these ones => redefine them
const IID my_IID_IGroupPolicyObject = 
 { 0xea502723, 0xa23d, 0x11d1, {0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3} };

const IID my_CLSID_GroupPolicyObject = 
 { 0xea502722, 0xa23d, 0x11d1, {0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3} };

GUID ext_guid = REGISTRY_EXTENSION_GUID;

// This next one can be any GUID you want
GUID snap_guid = { 0x3d271cfc, 0x2bc6, 0x4ac2, {0xb6, 0x33, 0x3b, 0xdf, 0xf5, 0xbd, 0xab, 0x2a} };

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

// Create an instance of the IGroupPolicyObject class
hr = CoCreateInstance(my_CLSID_GroupPolicyObject,
                      NULL,
                      CLSCTX_INPROC_SERVER,
                      my_IID_IGroupPolicyObject,
                      (LPVOID*)&pLGPO
                     );

if (SUCCEEDED(hr))
{   
    hr = pLGPO->OpenLocalMachineGPO( GPO_OPEN_LOAD_REGISTRY);
}

请问我做错了什么吗?

最佳答案

E_NOINTERFACE CoCreateInstance 调用的结果意味着 API 成功创建了有问题的实例,但未能获得请求的接口(interface)。

当接口(interface)在对象上根本不可用(根本没有实现)时,这肯定会发生,但是如果您看到它在某些情况下成功而在其他情况下失败,可能的原因是接口(interface)存在但它不能通过公寓和编码。如果您的代码在一个公寓中,而服务器在另一个公寓中(尤其是服务器是 STA 而您的代码是 MTA),则需要编码来连接两者。这反过来又假定接口(interface)可以使用自定义代理/ stub 对或通用来编码。

您需要使用具有关联且可用的代理/ stub 的接口(interface),或者您需要将代码移动到相同的 COM 单元中,例如后台线程 initialized respectively .您尝试使用的 COM 服务器用于 STA。因此,您需要一个初始化为 STA 的后台线程,然后在那里实例化对象并以非 COM 方式(或 COM 但不是通过 IGroupPolicyObject)将数据传递给原始调用方。

您的代码正在执行 CoInitializeEx 但它不检查结果。您应该在那里看到 RPC_E_CHANGED_MODE

关于C++ CoCreateInstance 方法返回 "No Such Interface supported",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30367528/

相关文章:

c++ - 从 std::继承类

c++ - 显式非单参数构造函数

c++ - 检查外部应用程序是否可用的最佳方法是什么?

c# - 从 Python 调用用 C# 编写的函数时,“NoneType”对象不可调用

java - 使用 C/C++ 或 Java 打开现金抽屉

c++ - 是否可以有一个进程外的 COM 服务器,其中一个单独的 O/S 进程用于每个对象实例?

c++ - 如何在 C/C++ 中(取消)转义字符串?

qt - 如何在另一个应用程序中使用 QT QML C++ 插件?

c++ - DLL 应用程序的在线更新

c# - C# 中的 COM 可以看到全局类实例吗?