当我在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);
}
请告诉我,我做错了什么?
答案 0 :(得分:4)
E_NOINTERFACE
调用的结果 CoCreateInstance
表示API已成功创建相关实例,但无法获取所请求的接口。
当接口在对象上根本不可用(根本没有实现)时,当然会发生这种情况,但是如果你在某些情况下看到它成功而在其他情况下失败,可能的原因是接口在那里但它不能穿过公寓和编组。如果您的代码在一个公寓中,而服务器在另一个公寓中(特别是服务器是STA而您的代码是MTA),则需要编组来连接这两个。这又假设接口可以使用自定义代理/存根对或通用进行封送。
您需要使用具有关联且可用的代理/存根的接口,或者您需要将代码移动到相同的COM公寓中,例如后台线程initialized respectively。您尝试使用的COM服务器用于STA。所以你需要一个初始化为STA的后台线程,然后你在那里实例化对象并以非COM方式(或COM而不是IGroupPolicyObject
)将数据传递给原始调用者。
您的代码正在执行CoInitializeEx
,但它不会检查结果。您应该看到RPC_E_CHANGED_MODE
。