c ++ CoCreateInstance方法返回“No Such Interface supported”

时间:2015-05-21 07:42:57

标签: c++ dll com group-policy

当我在dll中调用CoCreateInstance()时,我收到错误“没有支持这样的接口”。我正在尝试创建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);
}

请告诉我,我做错了什么?

1 个答案:

答案 0 :(得分:4)

E_NOINTERFACE调用的结果

CoCreateInstance表示API已成功创建相关实例,但无法获取所请求的接口。

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

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

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