Ошибка Coinitialize ex в вызове WMI в программной заглушке JNI - PullRequest
1 голос
/ 02 июня 2011

Среда:

У меня есть программа JNI, которая состоит из следующих частей

  1. C ++: здесь я использую WMI для возврата деталей запущенного процесса.Программа похожа на пример в http://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx Я включил весь код в пример с помощью оболочки JNI (один из параметров, которые я посылаю программе, имеет тип Integer).Ниже приведена сигнатура этой функции
    JNIEXPORT jdouble JNICALL Java_handlemonitor_NativeSytem_getSystemDetails (JNIEnv * env, jclass cls, jint pId)

Сгенерированная DLL хранится в папке bin внутри каталога JDK * 10121013 *

Java: здесь я просто вызываю функцию внутри dll и получаю возвращаемое значение.Я также создаю файл .h с помощью программы javah и включил его в программу C ++.

Проблема: при запуске программы в программе C ++ появляется сообщение об ошибке, из-за которой CoInitializeEx не удалосьс кодом ошибки 0x80010106.

следующая строка, в которой происходит сбой программы.

hres = CoInitializeEx (0, COINIT_MULTITHREADED).

Я попытался увеличить heapSize, но он продолжаетсятерпеть неудачу.

Есть какая-то конкретная причина, по которой CoInitializeEx не работает?

Заранее спасибо

1 Ответ

3 голосов
/ 02 июня 2011

Ошибка 0x80010106 означает «HRESULT - 0x80010106 - Невозможно изменить режим потока после его установки.»

Проблема в основном в том, что поток может Инициализировать свой режим COM (и тип квартиры, STA / MTA) только один раз. Как только он будет установлен, вы получите эту ошибку, если попытаетесь снова инициализировать с другим значением.

Часто с этой ошибкой происходит то, что какой-либо другой сторонний код вызывает инициализацию COM до выполнения вашего кода. Если это так, то у вас есть несколько вариантов:

1) Попробуйте найти способ, чтобы ваш код выполнялся первым, чтобы вы могли сами установить тип квартиры COM. Это может быть сложно, и может вызвать побочные эффекты, если сторонний код ожидает STA

2) Поместите свой код в собственный поток, где вы можете явно указать тип квартиры

Если вы на самом деле не заботитесь о типе квартиры, вы можете просто изменить вызов CoInitializeEx, чтобы использовать COINIT_APARTMENTTHREADED (STA) вместо COINIT_MULTITHREADED (MTA).

Надеюсь, это поможет,

John

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...