gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:48:32 25 4
gpt4 key购买 nike

当我调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com