YvesDaoust Ответов: 2

WMI вызывает исключение "0x800706B5: интерфейс неизвестен."


У меня есть фрагмент кода, который работал без проблем до сих пор. Он использует API инструментария управления Windows. Я не изменил ни код, ни что-либо в моей машине (насколько я знаю), но теперь, когда код запускается под отладчиком Visual Studio (либо 2008, либо 2003), он вызывает исключение, по-видимому, при вызове ConnectServer в приведенном ниже коде:
HRESULT hRes;

// Initialize
CoInitialize(0);

// Create the locator
IWbemLocator* pIWbemLocator= NULL;
IWbemServices* pWbemServices= NULL;
hRes= CoCreateInstance(
    CLSID_WbemLocator,
    0,
    CLSCTX_INPROC_SERVER,
    IID_IWbemLocator, (LPVOID *) &pIWbemLocator);
if (hRes != S_OK)
{
    return false; // Could not create the locator
}

// Connect to the server
hRes= pIWbemLocator->ConnectServer(
    L"ROOT\\CIMV2",          // WMI namespace
    NULL,                    // User name
    NULL,                    // User password
    0,                       // Locale
    NULL,                    // Security flags
    0,                       // Authority
    0,                       // Context object
    &pWbemServices           // IWbemServices proxy
    );
if (hRes != S_OK)
{
    return false; // Could not connect to the server
}

Если я проигнорирую исключение, то получу исключение "0xC0020043: произошла внутренняя ошибка в RPC.".

Я уверен, что этот код верен, поскольку он используется уже много лет. И я подчеркиваю, что при выполнении без отладчика все еще работает (как релиз, так и отладочные сборки), поэтому я не могу винить свою конфигурацию Windows. Но я застрял, когда хочу отладить.

Кто-нибудь может помочь ?

2 Ответов

Рейтинг:
5

YvesDaoust

В качестве workaroud я отключил разрыв в отладчике для этого конкретного исключения.

Debug > Exceptions... > Add > Win32 Exceptions > введите "интерфейс не найден" и "0x800706B5". Затем снимите флажок исключение.

Похоже, это работает до сих пор, надеясь, что он не всплывет на поверхность, когда этого меньше всего хочется...


Рейтинг:
0

KarstenK

вот вам пример.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa390423(v=против 85).aspx[^]

Постарайтесь, чтобы получить это работает.

Интересная разница заключается в следующем:

CoInitializeEx(0, COINIT_MULTITHREADED);


YvesDaoust

Привет Карстенк,

спасибо, что нашли время ответить на мой вопрос.

Хорошая новость: этот пример программы действительно работает (при условии, что вы удалите посторонний pclsObj->Release() в конце, который вызывает исключение нарушения доступа (!)).

Плохая новость: проблема все еще существует.
Она не лежит в функции инициализации (я уже пробовал три разных варианта, но безрезультатно: CoInitialize(0), CoInitializeEx(0, COINIT_APARTMENTTHREADED) и CoInitializeEx(0, COINIT_MULTITHREADED) - эти три работают с образцом программы.)
Я также попробовал дополнительный вызов CoInitializeSecurity, который отсутствует в моем коде. Это действительно изменило поведение в некоторых версиях моей программы, но не в других.
Поэтому я прихожу к выводу, что проблема заключается в отображении памяти dépendent или из-за расы, и ее будет труднее проследить, поскольку она несколько случайна.
В любом случае, ваше предложение открыло новые пути для расследования, спасибо.

KarstenK

Иногда речь идет о потоках и правах. Убедитесь, что код запущен в основном потоке, и попробуйте использовать права администратора.

Удачи ;-)

YvesDaoust

Код работает. Я уверен, что вопросы обеспечительных прав и потоковой передачи решаются правильно (даже если эти вопросы полностью и навсегда непрозрачны для меня), поскольку все последующие операции увенчаются успехом. Проблема молча игнорируется в обычном исполнении, это просто отладчик, который пытается бросить мне вызов.

Спасибо снова.

KarstenK

Вам следует связаться с корпорацией Майкрософт и подать отчет об ошибке ...