Я получаю ошибку «Нет такого интерфейса поддерживается», когда я вызываю CoCreateInstance () в DLL. Я пытаюсь создать экземпляр 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 успешно создал рассматриваемый экземпляр, но не смог получить запрошенный интерфейс.
Это, безусловно, может случиться, когда интерфейс просто недоступен на объекте (вообще не реализован), однако, если вы видите, что в некоторых сценариях он работает успешно, а в других — нет, вероятной причиной является то, что интерфейс есть, но он не может проходить через квартиры. и маршалинг. Если ваш код находится в одной квартире, а сервер — в другой (особенно сервер является STA, а ваш код — MTA), то для их соединения требуется маршалинг. Что, в свою очередь, предполагает, что интерфейс можно маршалировать с помощью настраиваемой пары прокси / заглушки или универсальной.
Вам нужно либо использовать интерфейсы, с которыми связаны и доступны прокси / заглушки, либо вам нужно переместить код в ту же квартиру COM, такую как фоновый поток инициализированы соответственно. COM-сервер, который вы пытаетесь использовать, предназначен для STA. Таким образом, вам нужен фоновый поток, инициализированный как STA, затем вы создаете экземпляр объекта и передаете данные исходному вызывающему абоненту не-COM-способом (или COM, но не через IGroupPolicyObject
).
Ваш код делает CoInitializeEx
но это не проверяет результат. Вы должны видеть RPC_E_CHANGED_MODE
там.